如何在SAS中声明全局数组变量?

时间:2015-06-09 16:18:28

标签: arrays sas global-variables sas-macro

我是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;

我需要它传递我在全局数组中指定的文件名。 谢谢你的帮助!

2 个答案:

答案 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')并分别保留。我还建议你把引号(引用宏的双引号)放入语句中,而不是宏变量。