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")));
类似的东西。我不认为你需要单引号 - 如果你愿意,可以使用宏引号来避免逗号,但我不确定你是否需要它。
我的问题如下 - 我有一个宏应该遍历字符串片段并在 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")));
类似的东西。我不认为你需要单引号 - 如果你愿意,可以使用宏引号来避免逗号,但我不确定你是否需要它。