如何在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文件或其他东西?让我们把它放在这里的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')和其余部分。我还建议您将引号(双引号用于触发宏)放入语句中,但不要使用宏变量。

相关内容

  • 没有找到相关文章

最新更新