SAS - 循环通过文本片段的宏

时间:2017-01-18 14:44:01

标签: sas sas-macro

我的问题是 - 我有一个宏应该循环遍历字符串并在sql过程中使用这些字符串。问题是这些字符串不简单紧凑,可能有空格,引号。

输入宏%roz的字符串如下:

list1,list2
OID,in ("IDC","NPK")
OED,in ("EDC")
ZFP,in ("ZFP")

宏以这种方式看待:

%macro roz(list1,list2);
%let n=%sysfunc(countw(&list1));
 %do i=1 %to &n;
     %let kanal = %scan(&list1,&i);
     %let inlist = %scan(&list2,&i);
proc sql;
 create table data_stor1_&kanal._file as select sum(pocet)
  as pocet, Dch
  from data_stor3_&kanal where Dch &inlist group by dat_poc;
quit;

%end;
%mend roz;

%roz(OID OED,'in ("IDC","NPK")' 'in ("EDC")');

我的问题是我不知道如何让我的宏读取list2中的部分并保留格式(引号,空格,e.t.c。)。我可以通过从字符串切换到数字来解决我的程序中的问题,但我很好奇是否有办法直接解决它。

我的两个sql"选择"应该以这种方式看待:

 create table data_stor1_OID_file as select sum(pocet) as pocet, Dch
 from data_stor3_OID where Dch in ("IDC","NPK") group by dat_poc;

 create table data_stor1_OED_file as select sum(pocet) as pocet, Dch
 from data_stor3_OED where Dch in ("EDC") group by dat_poc;

感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

为列表使用不是空格的字符串分隔符(并且不会出现在字符串中)。

%macro roz(list1,list2);
%let n=%sysfunc(countw(&list1,|));
 %do i=1 %to &n;
     %let kanal = %scan(&list1,&i,|);
     %let inlist = %scan(&list2,&i,|);
proc sql;
 create table data_stor1_&kanal._file as select sum(pocet)
  as pocet, Dch
  from data_stor3_&kanal where Dch &inlist group by dat_poc;
quit;

%end;
%mend roz;

%roz(OID|OED,%nrstr(in ("IDC","NPK")|in ("EDC")));

这样的事情。如果你愿意的话,我不需要单引号 - 使用宏引用以避免使用逗号,但我不确定你是否需要单引号。