I'm new to SAS and spinning my wheels. The SAS documentation and other Google searches have not helped me figure this out. How can I declare a global array variable that I can use in various procedures to loop through the contents?
Here is what I've tried:
%let fileArray = array{*} $32 file1-file4 ('ce_abcdef_filedetail1' 'ce_abcdef_filedetail2' 'ce_abcdef_filedetail3' 'ce_abcdef_filedetail4' );
/* Loop through each file and run the macro*/
do i = 1 to dim(fileArray);
%analyze_file(FILENAME=&fileArray[i], PATH=&path, OUTPUT=&output)
end;
I need it to pass the filename that I specify in the global array. Thanks for any help!
What you're trying to do is basically to use a data driven programming approach to drive your macros. Good for you! However, you can't do it directly the way you are trying to. While you could use a macro array the way Yukclam9 mentions, there's an easier way.
SAS doesn't use arrays the way
r
uses vectors or matrices: SAS uses datasets, though, and you can do a lot of the same things.Put your filenames into a dataset - perhaps they're already there, in an excel file or something? Let's put it here in datalines, in case they're not.
Now, you want to get them into a macro call. Sweet, we have a lot of ways of doing that. This is the quickest.
CATS just concatenates and strips spaces. I leave
&path
and&output
alone as it looks like they're global macro variables - of course if they're also variable, you could include them the same way.Now
&mcalllist
is a global macro variable that stores your four macro calls (or however many were in that dataset, one per row)! You just executeand presto, it calls your macro. You can also use
call execute
or construct a file and%include
it to do much the same thing, with some different limitations. (This one has a maximum of 65k characters or so, for example.)