BookmarkSubscribeRSS Feed
Fluorite | Level 6

Hi everybody,


I have this task that I want to automate: I have a path containing multiple folders and subfolders. Each and every single one either contains a sas dataset or it is empty. I want to delete all the data in each one of these while keeping the structure of the table. For example if I have a table like the SASHELP.CLASS It will be converted to a table with zero rows but with all the metadata intact (SAS EG would display only Name Age Sex Weight and Height).


I could try to pipe some carefully crafted linux command to a file and then use each row for a libname statement, something like


filename libs_file PIPE 'find /my/path -d' 

then I could write:


DATA libs;

    INPUT path 1000 $;

    INFILE libs_file;

    IF eof THEN CALL SYMPUT("nlibs", _N_);



And then use this to somehow use a LIBNAME for each row. 


Any input would be greatly appreciated.

Thanks 🙂 







Super User

Deleting data is scary, and crawling through a directory tree to delete all data is scarier...  but since you sound braver than me, I would use a directory tree crawler macro (or an OS command piped to a dataset) to build a control dataset which is a list of the SAS datasets of interest.  SAS can use a file specification in a DATA step, so you don't need a libname statement or a macro.  You could read in the control dataset and use CALL EXECUTE to generate a scary step for each dataset, like (untested):


data "/path/to/mydata.sas7bdat";
  set "/path/to/mydata.sas7bdat";

I think that might work.  But I'm not going to test it.  And maybe take a backup first.  : )

BASUG is hosting free webinars Next up: Mark Keintz presenting History Carried Forward, Future Carried Back: Mixing Time Series of Differing Frequencies on May 8. Register now at the Boston Area SAS Users Group event page:
Super User
filename dirtree url '';

%include dirtree;

%dirtree(directory=/home/fkhurshed/CLASS2, out=myfiles, maxdepth=1);

data erase;
set myfiles end = eof;

length str1 $1000.;

if _n_ =1 then call execute ('proc sql;');

if find( filename, 'sas7bdat')>0 then do;

datasetpath = catx('/', path, filename );

str1 = catx(' ', 'delete * from ', quote(trim(datasetpath)), ';');
call execute(str1);

if eof then call execute ('quit;');


Drop all rows from the datasets. %Dirtree will create the list of files - use maxdepth to control how far down the subdirectories you navigate.


Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.


Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 2 replies
  • 3 in conversation