SAS - 宏循环遍历文本片段

SAS - macro looping through pieces of text

我的问题如下 - 我有一个宏应该遍历字符串片段并在 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 "selects" 应该是这样的:

 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;

感谢您的任何建议!

为您的列表使用不是 space 的字符串定界符(并且不会以其他方式出现在您的字符串中)。

%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")));

类似的东西。我不认为你需要单引号 - 如果你愿意,可以使用宏引号来避免逗号,但我不确定你是否需要它。