[英]How to Declare Global Array Variable in SAS?
我是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文件中或其他内容中? 让我们将其放在数据线中,以防万一。
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')和其余宏。 我还建议您将引号(双引号触发宏)放入语句中,但不要与宏变量一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.