如何在 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 个字符左右。)