我是SAS宏编程的新手,需要启用以下宏才能处理和处理其宏参数的多个值。您好,
data have;
input name $ ACCOUNT_ID $ cust_id;
cards;
ARTHUR CC1234 1234
TOM eil1235 1235
MIKEZ tb1236 1236
MATT mb1237 1237
LIZ TB1238 1238
PIZ VB1239 1239
TAN MB1240 1240
PANDA . 1241
;
run;
%MACRO algo (IN_DS=,VAR_LIST=,DATA_TYPE_LIST=,OUT_DS=);
DATA &OUT_DS;
SET &IN_DS;
%If &data_type_LIST = num %then
&var_LIST=sum(&VAR_LIST,2);
%else &var_LIST=cats(&var_LIST,'re');;
run;
%mend;
%algo(IN_DS=HAVE,VAR_LIST=CUST_ID,DATA_TYPE_LIST=num,OUT_DS=out1);`
我现在需要启用此宏,以便能够为宏参数传递多个值。像这样:
%algo(IN_DS=HAVE,VAR_LIST='CUST_ID,ACCT_ID',DATA_TYPE_LIST='num,char',OUT_DS=out1);
有人可以帮我在宏代码中启用此功能。
答案 0 :(得分:1)
在宏调用中,参数实参应用%STR()宏引用。
尝试
%algo
( IN_DS=HAVE
, VAR_LIST= %STR (CUST_ID, ACCT_ID)
, DATA_TYPE_LIST=num
, OUT_DS=out1
);
宏引用不同于用于字符常量的DATA步骤引用。
答案 1 :(得分:1)
确保宏可以处理多个值。通常,在调用宏时,在值列表中使用逗号作为定界符不是一个好主意。
通常,空间是最好的定界符,因为这样您就可以直接在生成的代码中使用宏值。例如,如果变量都属于同一类型,则只需使用数据步骤ARRAY。
%MACRO algo (IN_DS=,VAR_LIST=,DATA_TYPE_LIST=,OUT_DS=);
DATA &OUT_DS;
SET &IN_DS;
array list &var_list ;
do _n_=1 to dim(list);
%if &data_type_LIST = num %then %do ;
list(_n_)=sum(list(_n_),2);
%end;
%else %do;
list(_n_)=cats(list(_n_),'re');
%end;
end;
run;
%mend algo;
如果变量不是全部相同类型,则需要为每个变量生成单独的语句。在这种情况下,您可以根据需要使用其他定界符(例如,竖线字符),该定界符在调用%scan()
之类的宏函数时更容易用作定界符。
%MACRO algo (IN_DS=,VAR_LIST=,DATA_TYPE_LIST=,OUT_DS=);
%local i var;
DATA &OUT_DS;
SET &IN_DS;
%do i=1 %to %sysfunc(countw(&var_list,|));
%let var=%scan(&var_list,&i,|);
%if %scan(&data_type_LIST,&i,|) = num %then %do ;
&var=sum(&var,2);
%end;
%else %do;
&var=cats(&var,'re');
%end;
%end;
run;
%mend algo;
%algo(IN_DS=HAVE,VAR_LIST=CUST_ID|ACCT_ID,DATA_TYPE_LIST=num|char,OUT_DS=out1);
答案 2 :(得分:0)
如果要传递变量列表,然后在上面发布的代码中使用该列表,我的建议是将&var_list视为列表,并使用scan确定有多少个变量,然后循环在列表中浏览并相应执行代码。