我是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;
我需要它传递我在全局数组中指定的文件名。谢谢你的帮助!
您要做的基本上是使用数据驱动的编程方法来驱动宏。好样的!然而,你不能像你想的那样直接做到这一点。虽然您可以像Yukclam9提到的那样使用宏数组,但还有一种更简单的方法。
SAS不像r
使用向量或矩阵那样使用数组:SAS使用数据集,尽管如此,你可以做很多相同的事情。
把你的文件名放入一个数据集-也许他们已经在那里了,在excel文件或其他东西?让我们把它放在这里的datalines中,以防它们不是。
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
,然后,它调用你的宏。您也可以使用call execute
或构造一个文件并使用%include
来完成相同的工作,但有一些不同的限制。(例如,这个最多有65k个字符左右)
查看这篇信息丰富的文章:宏数组语句
你可以通过
创建数组%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')和其余部分。我还建议您将引号(双引号用于触发宏)放入语句中,但不要使用宏变量。