Bra*_*rad 1 arrays global-variables sas sas-macro
我是SAS的新手并且在转动轮子.SAS文档和其他Google搜索没有帮助我解决这个问题.如何声明一个全局数组变量,我可以在各种过程中使用它来遍历内容?
这是我尝试过的:
%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;
Run Code Online (Sandbox Code Playgroud)
我需要它来传递我在全局数组中指定的文件名.谢谢你的帮助!
你要做的是基本上使用数据驱动的编程方法来驱动你的宏.对你有益!但是,你不能按照你想要的方式直接做到这一点.虽然您可以像Yukclam9提到的那样使用宏阵列,但有一种更简单的方法.
SAS不r使用矢量或矩阵的方式使用数组:但SAS使用数据集,你可以做很多相同的事情.
把你的文件名放到一个数据集中 - 也许它们已经存在于excel文件中了?我们把它放在数据线中,以防它们没有.
data filenames;
input filename :$32.;
datalines;
ce_abcdef_filedetail1
ce_abcdef_filedetail2
ce_abcdef_filedetail3
ce_abcdef_filedetail4
;;;;
run;
Run Code Online (Sandbox Code Playgroud)
现在,您想让它们进入宏调用.很好,我们有很多方法可以做到这一点.这是最快的.
proc sql;
select cats('%analyze_file(FILENAME=',filename,", PATH=&path, OUTPUT=&output)")
into :mcalllist separated by ' '
from filenames;
quit;
Run Code Online (Sandbox Code Playgroud)
CATS只是连接并剥离空格.我一个人离开&path,&output因为看起来它们是全局宏变量 - 当然如果它们也是可变的,你可以用同样的方式包含它们.
现在&mcalllist是一个全局宏变量,用于存储您的四个宏调用(或者在该数据集中有多个,每行一个)!你刚刚执行
&mcalllist
Run Code Online (Sandbox Code Playgroud)
并且它会调用你的宏.您也可以使用call execute或构建一个文件,%include它可以做同样的事情,但有一些不同的限制.(例如,这个字符最多有65k个字符.)