Sas 列出宏变量';在过程中使用前缀替换值

Sas 列出宏变量';在过程中使用前缀替换值,sas,sas-macro,Sas,Sas Macro,假设我创建了一个宏变量 %,让PAR=VAR1 VAR2 VAR3; 现在我想在这样的过程中使用这些值 proc分数数据=测试类型=parms分数=par out=分数; 变量W_var1 W_var2 W_var3; 运行 例如,如果var1=age,那么我想在var语句中列出W_age。我尝试了var W\u&par但它不起作用。有人能帮我一个简单的解决方案吗?非常感谢 必须创建宏才能解决此问题 宏从宏变量中获取每个参数,并向其添加一些前缀 %macro list_with_prefix

假设我创建了一个宏变量

<代码> %,让PAR=VAR1 VAR2 VAR3;<代码>

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

proc分数数据=测试类型=parms分数=par out=分数;
变量W_var1 W_var2 W_var3;
运行


例如,如果var1=age,那么我想在var语句中列出W_age。我尝试了
var W\u&par但它不起作用。有人能帮我一个简单的解决方案吗?非常感谢

必须创建宏才能解决此问题

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

%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/,-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));

有关可以添加前缀、后缀和分隔符的实用程序宏,请参阅Richard DeVenezia的宏%seplist。