sas宏参数的多个值

时间:2018-12-21 02:38:46

标签: macros sas

我是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); 有人可以帮我在宏代码中启用此功能。

3 个答案:

答案 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确定有多少个变量,然后循环在列表中浏览并相应执行代码。