BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
iscgonzalez
Obsidian | Level 7

Hello guys,

 

I'm trying to delete multiple files that are contained in a dataset, the dataset  contains data like this:

 

Path

-----------------

/test/file1.txt

/test/file2.txt

/test/file3.txt

/test/file4.txt

/test/file5.txt

.....

 

so I want to do something like this

 

data _null_;

set path_table;

call symput('file',path);

x "rm -rf &file";

run;

 

but before I submit the command I wanted to test what I'm sending to the x window with something like this:

 

data _null_;
set work.files;
call symput('file',path);
%put &file;
run;

 

But I'm just getting one line in the log. what can I be possibly be doing wrong?

1 ACCEPTED SOLUTION

Accepted Solutions
Astounding
PROC Star

You would do better to use CALL SYMPUTX instead of CALL SYMPUT.  That way, the softtware automatically removes leading and trailing blanks from the macro variable it creates.  Even if you get the %PUT statement to execute the way you intend, it won't necessarily show leading and trailing blanks.

 

%PUT statements are never part of a DATA step.  You could easily use a PUT statement:

 

put path;

 

To use %PUT you would need to jump through quite a few hoops:  find out the number of paths in your data set, write a macro loop that goes through a DATA step reading just one observation, then executes %put.  If that's worth it, we can look at some details.

 

 One final thought about a trick that may work:  try changing the %PUT statement to read:

 

call execute('%put &file;');

 

CALL EXECUTE will execute macro statements immediately, so may be able to track the current value of &FILE.

 

Update:  Confirmed that the last idea above does actually work.

View solution in original post

5 REPLIES 5
art297
Opal | Level 21

Your macro variable won't resolve until the end of the datastep.

 

I would just create a variable and run it within the datastep (e.g (untested):

 

data _null_;
  set work.archivos2;
  length commd $80;

  let commd=catx(' ','x "rm -rf',path,'"');

  call execute(commd);

run;

 

Art, CEO, AnalystFinder.com

 

ChrisBrooks
Ammonite | Level 13

No need to shell out to the operating system e.g.

 

data have;
	length path $50;
	infile datalines;
	input path;
	datalines;
/folders/myshortcuts/Dropbox/Test/file1.txt
/folders/myshortcuts/Dropbox/Test/file2.txt
/folders/myshortcuts/Dropbox/Test/file3.txt
;
run;

data _null_;
	set have;	
	fname="temp";
    rc=filename(fname,path);
    if rc = 0 and fexist(fname) then
       rc=fdelete(fname);
    rc=filename(fname);
   
run;
iscgonzalez
Obsidian | Level 7

I think this might not be 100% useful for my case, because in the list that I have I also have directories with subdirectories and files in there.

 

I wanted to shell out because I wanted to use the -rf option on rm command.

 

Reeza
Super User

FDELETE is a better option, because X command can be disabled on many systems and the commands will vary based on OS, whereas FDELETE will not change.

Astounding
PROC Star

You would do better to use CALL SYMPUTX instead of CALL SYMPUT.  That way, the softtware automatically removes leading and trailing blanks from the macro variable it creates.  Even if you get the %PUT statement to execute the way you intend, it won't necessarily show leading and trailing blanks.

 

%PUT statements are never part of a DATA step.  You could easily use a PUT statement:

 

put path;

 

To use %PUT you would need to jump through quite a few hoops:  find out the number of paths in your data set, write a macro loop that goes through a DATA step reading just one observation, then executes %put.  If that's worth it, we can look at some details.

 

 One final thought about a trick that may work:  try changing the %PUT statement to read:

 

call execute('%put &file;');

 

CALL EXECUTE will execute macro statements immediately, so may be able to track the current value of &FILE.

 

Update:  Confirmed that the last idea above does actually work.

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

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
  • 5 replies
  • 10061 views
  • 8 likes
  • 5 in conversation