我是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;
我需要它传递我在全局数组中指定的文件名。 谢谢你的帮助!
答案 0 :(得分:5)
您尝试做的基本上是使用数据驱动编程方法来驱动您的宏。对你有益!但是,您无法按照自己的方式直接执行此操作。虽然您可以像Yukclam9提到的那样使用宏阵列,但这是一种更简单的方法。
SAS并没有像r
使用向量或矩阵一样使用数组:但SAS使用数据集,你可以做很多相同的事情。
将您的文件名放入数据集中 - 也许他们已经存在于excel文件中?我们将它放在数据表中,以防它们不存在。
data filenames;
input filename :$32.;
datalines;
ce_abcdef_filedetail1
ce_abcdef_filedetail2
ce_abcdef_filedetail3
ce_abcdef_filedetail4
;;;;
run;
现在,您希望将它们置于宏调用中。很好,我们有很多方法可以做到这一点。这是最快的。
proc sql;
select cats('%analyze_file(FILENAME=',filename,", PATH=&path, OUTPUT=&output)")
into :mcalllist separated by ' '
from filenames;
quit;
CATS只是连接并剥离空格。我单独留下&path
和&output
,因为它们看起来像是全局宏变量 - 当然如果它们也是变量,你可以用同样的方式包含它们。
现在&mcalllist
是一个全局宏变量,用于存储您的四个宏调用(或者多个在该数据集中,每行一个)!你刚刚执行
&mcalllist
和presto,它调用你的宏。您也可以使用call execute
或构建一个文件,%include
它可以做同样的事情,但有一些不同的限制。 (例如,这个字符最多有65k个字符。)
答案 1 :(得分:0)
查看这篇内容丰富的文章:Macro Array Statement
你可以做的是通过
创建数组%array ( younameit, values = 'ce_abcdef_filedetail1' 'ce_abcdef_filedetail2' ...)
注意术语"值"固定和" ="之后的值取决于你
并使用%do_over
%macro read_file(fileArray);
%analyze_file(FILENAME=&fileArray, PATH=&path, OUTPUT=&output)
%end;
%mend read_file;
%do_over(younameit, macro=read_file)
结果将触发宏read_file(' ce_abcdef_filedetail1'),read_file(' ce_abcdef_filedetail2')并分别保留。我还建议你把引号(引用宏的双引号)放入语句中,而不是宏变量。