繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM