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

listing macro variable's values with prefix in a procedure

假设我创建了一个宏变量。

%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_∥ 但它不起作用。任何人都可以在这里帮我一个简单的解决方案吗?非常感谢!!

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

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

%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;

使用正则表达式:

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

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

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

但是您确实需要确保您的参数在单词之间没有多个空格。所以要么先 运行 要么把它嵌套到上面的语句中。

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