无与伦比的引号SAS

时间:2012-05-03 17:19:42

标签: sas

%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,但问题仍然存在。 到目前为止,我能看到的唯一解决方案是修改模态的名称,但由于名称来自客户端,我无法对数据进行修改。

谢谢

2 个答案:

答案 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)) ;