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

Bra*_*rad 1 arrays global-variables sas 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;
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*Joe 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;
Run Code Online (Sandbox Code Playgroud)

现在,您想让它们进入宏调用.很好,我们有很多方法可以做到这一点.这是最快的.

proc sql;
  select cats('%analyze_file(FILENAME=',filename,", PATH=&path, OUTPUT=&output)")
    into :mcalllist separated by ' '
    from filenames;
quit;
Run Code Online (Sandbox Code Playgroud)

CATS只是连接并剥离空格.我一个人离开&path,&output因为看起来它们是全局宏变量 - 当然如果它们也是可变的,你可以用同样的方式包含它们.

现在&mcalllist是一个全局宏变量,用于存储您的四个宏调用(或者在该数据集中有多个,每行一个)!你刚刚执行

&mcalllist
Run Code Online (Sandbox Code Playgroud)

并且它会调用你的宏.您也可以使用call execute或构建一个文件,%include它可以做同样的事情,但有一些不同的限制.(例如,这个字符最多有65k个字符.)