Hi,
I have few macros which has a step includes same folder name and filename everytime I run;
example:
%content(folder1,filename1);
%sort(folder1,filename1);
%average(folder1,filename1);
---------------------------------------------------------------
%content(folder2,filename2);
%sort(folder2,filename2);
%average(folder2,filename2);
I dont want to type everytime folder1 and filename1 for each time. Is there a way that I could code something if I want to change folder1 to folder2 for with one code?.
It would likely help to show us what your folder values look like but something similar to this may be what you are looking for.
%let path= d:\data\subfolder; %content(&path.,filename1); %sort(&path.,filename1); %average(&path.,filename1);
unless you mean to iterate over a bunch of folders.
Macro variables to the rescue!
Define what you would like folder and filename to be:
%let folder = folder1;
%let filename = filename1;
Then, use these macro variables as the parameters in your macro functions:
%content(&folder. , &filename.); /* resolves to %content(folder1, filename2) */
%sort(&folder. , &filename.); /* etc. */
%average(&folder. , &filename.);
Alternatively, if your folders and filenames always only differ by the number suffix, then you could do:
%let folderNbr = 1;
%let filenameNbr = 1;
%content(folder&folderNbr. , filename&filenameNbr.); /* resolves to %content(folder1, filename2) */
%sort(folder&folderNbr. , filename&filenameNbr.); /* etc. */
%average(folder&folderNbr. , filename&filenameNbr.);
If you don't want to change the folder numbers manually for each run, you could even set up a loop to increment them automatically.
data data2run;
infile cards dlm="|" dsd;
length folder $256. filename $256.;
input folder $ filename $;
cards;
C:\path to folder\demo | file1
C:\path to folder\sample | file23
;;;;
run;
data runReports;
set data2run;
str1 = catt('%content(', folder, ", ", filename, ");");
str2 = catt('%sort(', folder, ", ", filename, ");");
str3 = catt('%average(', folder, ", ", filename, ");");
call execute(str1);
call execute(str2);
call execute(str3);
run;
This is an example of what I would recommend. Add in your path and filenames to the first part of the code. The second part does not change and will execute all your macros for each line provided.
The absolute short version:
%macro run_all(folder,filename);
%content(&folder,&filename);
%sort(&folder,&filename);
%average(&folder,&filename);
%mend;
data _null_;
infile datalines dlm="|" dsd truncover;
input folder :$256. file :$256.;
call execute(cats('%nrstr(%run_all(',folder,',',file,'))'));
datalines;
folder1|filename1
folder2|filename2
;
Now you can call macro %run_all manually for a single shot, or use the data step for an arbitrary number of repeats.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!
SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.
Find more tutorials on the SAS Users YouTube channel.