%macro name_modal();
/*Create macro variables which contain the modalities of variables*/
%do i=1 %to &num_Var;
data _null_;
set &lib..Table_variable_modal_&i.;
call symputx('num_Mod'||compress(put(&i,4.)),_N_,"G");
call symputx('table'||compress(put(&i,4.))||'modal'||compress(put(_N_,4.)),compress(&&name_Var&i.),"G");
run;
%end;
/*Display modalities by variable*/
%do i=1 %to &num_Var;
%put &&name_Var&i. has &&num_Mod&i. modalities ;
%do j=1 %to &&num_Mod&i.;
%put %nrstr(&&tableb&i.modal&j.);
%end;
%end;
%mend name_modal;
%name_modal();
我希望代码是自我记录的。 我会在这里解释一下这些问题。 一切都工作正常,直到我传递到程序的第二个,用于显示变量的模态。
例如,当宏变量中存储的模态名称类似于
时
$ 100%BLO,
100%颜色,
AVON& RAGOBERT,
百龄坛,
欧莱雅,
AT& T公司,
U-V-A
等
我没有正确使用%put。
我尝试过使用%bquote和%nrstr,但问题仍然存在。
到目前为止,我能看到的唯一解决方案是修改模态的名称,但由于名称来自客户端,我无法对数据进行修改。
谢谢
答案 0 :(得分:2)
尝试几次后,我发现%superq
可以解决这个问题。处理宏中的特殊字符很麻烦。这个page提供了一些关于宏报价的有用提示。
我将您的代码简化为以下
更新:使其成为双循环案例。
data test;
input name ~ & $15.;
datalines;
100% BLO
100% COLOR
AVON & RAGOBERT
BALLANTINE'S
L'OREAL
AT&T
U-V-A
;
run;
%macro name_modal();
/*Create macro variables which contain the modalities of variables*/
%do i=1 %to 4;
data _null_;
set test;
call symputx('num_Mod1',_N_,"G");
call symputx('tableb'||compress(put(&i,4.))||'modal'||compress(put(_N_,4.)),name,"G");
run;
%end;
%do i=1 %to 4;
%do j=1 %to 7;
%put %superq(tableb&i.modal&j);
%end;
%end;
%mend name_modal;
%name_modal();
结果将正确显示。
请注意,%superq(tableb&i.modal&j)
不是%superq(&&tableb&i.modal&j)
因为superq
接受宏变量名称而没有额外的&符号。
答案 1 :(得分:1)
很难回答所有样本数据的问题,因为我无法重新创建代码(缺少全局宏)。
[更新] 要让宏解析哪些包含需要屏蔽的字符更加困难。发布一些可以执行的代码,可以提供更多帮助。
Here是宏报价的良好链接。
This有一个非常好的图表,详细说明了用于不同情况的宏掩蔽函数。
%Str即使是%或&包含在字符串中,只要它们后跟一个空格即可。 %NRSTR,如果其中任何一个可以解释为宏变量或宏调用。 您可以在单引号(')或单引号(")之前加百分号(%),或使用BQUOTE或NRBQUOTE(如果您的字符串包含&或%)。
这是一个开始 [更新] :
%Macro Test(var=);
%Put &var;
%Mend test;
%Test(Var=%str($100% BLO)) ;
%Test(Var=%str(100% COLOR)) ;
%Test(Var=%nrstr(100 %COLOR)) ;
%Test(Var=%str(AVON & RAGOBERT)) ;
%Test(Var=%nrstr(AVON &RAGOBERT)) ;
%Test(Var=%str(BALLANTINE%'S)) ;
%Test(Var=%bquote(BALLANTINE'S)) ;
%Test(Var=%str(L%'OREAL)) ;
%Test(Var=%bquote(L'OREAL)) ;
%Test(Var=%nrstr(AT&T)) ;
%Test(Var=%str(U-V-A)) ;