首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >sas宏参数的多个值

sas宏参数的多个值
EN

Stack Overflow用户
提问于 2018-12-21 10:38:46
回答 3查看 1.6K关注 0票数 0

我是SAS宏编程的新手,需要启用以下宏才能处理其宏parameters.Hello的多个值。

代码语言:javascript
复制
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);可以帮助我在宏代码中启用此功能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-21 22:00:01

确保宏可以处理多个值。通常,在调用宏时使用逗号作为值列表中的分隔符不是一个好主意。

通常,空格是最好的分隔符,因为这样您就可以在生成的代码中直接使用宏值。例如,如果您的变量都属于同一类型,则可以只使用data step数组。

代码语言:javascript
复制
%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()等宏函数时更容易用作分隔符。

代码语言:javascript
复制
%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);
票数 1
EN

Stack Overflow用户

发布于 2018-12-21 20:42:52

参数实参应该是宏调用%STR()引用的宏。

试一试

代码语言:javascript
复制
%algo 
( IN_DS=HAVE
, VAR_LIST= %STR (CUST_ID, ACCT_ID)
, DATA_TYPE_LIST=num
, OUT_DS=out1
);

宏引用不同于用于字符文字的数据步骤引用。

票数 2
EN

Stack Overflow用户

发布于 2018-12-21 16:10:54

如果您希望传递一个变量列表,然后在上面发布的代码中使用该列表,我的建议是将&var_list视为一个列表,并使用扫描来确定有多少变量,然后循环遍历该列表并相应地执行代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53878527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档