如何在 SAS 中声明全局数组变量?
How to Declare Global Array Variable in SAS?
我是 SAS 的新手,正在努力学习。 SAS 文档和其他 Google 搜索没有帮助我解决这个问题。如何声明一个全局数组变量,我可以在各种过程中使用它来循环遍历内容?
这是我试过的方法:
%let fileArray = array{*} 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;
我需要它来传递我在全局数组中指定的文件名。
感谢您的帮助!
查看这篇内容丰富的文章:Macro Array Statement
你可以做的是通过
创建数组
%array ( younameit, values = 'ce_abcdef_filedetail1' 'ce_abcdef_filedetail2' ...)
请注意,术语 "values" 是固定的,“=”后的值由您决定
并用 %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')和剩余宏。我还建议您将引号(触发宏的双引号)放入语句中,但不要与宏变量一起使用。
您要做的基本上是使用数据驱动的编程方法来驱动您的宏。对你有好处!但是,您不能按照您尝试的方式直接进行操作。虽然您可以按照 Yukclam9 提到的方式使用宏数组,但还有一种更简单的方法。
SAS 使用数组的方式与 r
使用向量或矩阵的方式不同:SAS 使用数据集,但您可以做很多相同的事情。
将您的文件名放入数据集中 - 也许它们已经存在于 excel 文件或其他文件中?让我们把它放在数据线中,以防它们不是。
data filenames;
input filename :.;
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 个字符左右。)
我是 SAS 的新手,正在努力学习。 SAS 文档和其他 Google 搜索没有帮助我解决这个问题。如何声明一个全局数组变量,我可以在各种过程中使用它来循环遍历内容?
这是我试过的方法:
%let fileArray = array{*} 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;
我需要它来传递我在全局数组中指定的文件名。 感谢您的帮助!
查看这篇内容丰富的文章:Macro Array Statement
你可以做的是通过
创建数组%array ( younameit, values = 'ce_abcdef_filedetail1' 'ce_abcdef_filedetail2' ...)
请注意,术语 "values" 是固定的,“=”后的值由您决定
并用 %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')和剩余宏。我还建议您将引号(触发宏的双引号)放入语句中,但不要与宏变量一起使用。
您要做的基本上是使用数据驱动的编程方法来驱动您的宏。对你有好处!但是,您不能按照您尝试的方式直接进行操作。虽然您可以按照 Yukclam9 提到的方式使用宏数组,但还有一种更简单的方法。
SAS 使用数组的方式与 r
使用向量或矩阵的方式不同:SAS 使用数据集,但您可以做很多相同的事情。
将您的文件名放入数据集中 - 也许它们已经存在于 excel 文件或其他文件中?让我们把它放在数据线中,以防它们不是。
data filenames;
input filename :.;
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 个字符左右。)