在过程中列出带有前缀的宏变量值

时间:2017-02-22 04:55:27

标签: sas sas-macro

我们说我创建了一个宏变量。

%let par = var1 var2 var3;

现在我想在像这样的程序中使用这些值

proc score data=test type=parms score=par out=score; var W_var1 W_var2 W_var3; run;

例如,如果var1 = age,那么我想在var语句中列出W_age。我试过var W_∥,但它没有用。有人能帮我解决一个简单的解决方案吗?非常感谢!!

3 个答案:

答案 0 :(得分:2)

您必须创建一个宏来解决此问题。

宏从宏变量中获取每个参数,并为其添加一些前缀。

%macro list_with_prefix(string, prefix);
    %local i;
    %let i = 1;
    %do %until(%scan(&string., &i., %str( )) = );
        &prefix.%scan(&string., &i., %str( ))
        %let i = %eval(&i. + 1);
    %end;
%mend;

%let par = var1 var2 var3;

proc score data=test type=parms score=par out=score; 
    var %list_with_prefix(&par, W_);
run;

答案 1 :(得分:0)

使用常规快递:

%let par = var1 var2 var3;
%let new_par=%sysfunc(prxchange(s/(\w+)/W_$1/,-1,&par));
%put &new_par;

答案 2 :(得分:0)

这可以使用TRANWRD()函数来解决。

%let par = var1 var2 var3;
%let new_par=W_%sysfunc(tranwrd(&par,%str( ),%str( W_)));
%put &new_par;

但是你需要确保你的参数在单词之间没有多个空格。所以要先运行它,要么将它嵌入上面的语句中。

%let par=%sysfunc(compbl(&par));