我是SAS宏编程的新手,需要启用以下宏才能处理其宏parameters.Hello的多个值。
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);
可以帮助我在宏代码中启用此功能。
发布于 2018-12-21 22:00:01
确保宏可以处理多个值。通常,在调用宏时使用逗号作为值列表中的分隔符不是一个好主意。
通常,空格是最好的分隔符,因为这样您就可以在生成的代码中直接使用宏值。例如,如果您的变量都属于同一类型,则可以只使用data step数组。
%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);
发布于 2018-12-21 20:42:52
参数实参应该是宏调用%STR()引用的宏。
试一试
%algo
( IN_DS=HAVE
, VAR_LIST= %STR (CUST_ID, ACCT_ID)
, DATA_TYPE_LIST=num
, OUT_DS=out1
);
宏引用不同于用于字符文字的数据步骤引用。
发布于 2018-12-21 16:10:54
如果您希望传递一个变量列表,然后在上面发布的代码中使用该列表,我的建议是将&var_list视为一个列表,并使用扫描来确定有多少变量,然后循环遍历该列表并相应地执行代码。
https://stackoverflow.com/questions/53878527
复制相似问题