4
%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% COLOR、
AVON & RAGOBERT、
BALLANTINE'S、
L'OREAL、
AT&T、
UVA
等时,
我无法正确使用 %put。我尝试使用 %bquote 和 %nrstr,但问题仍然存在。到目前为止,我能看到的唯一解决方案是修改模式的名称,但由于名称来自客户,我无法对数据进行修改。

谢谢

4

2 回答 2

2

尝试了几次后,我发现%superq可以解决这个问题。在宏中处理特殊字符很麻烦。本页提供了一些关于宏引用的有用提示。

我将您的代码简化为以下

更新:使其成为双循环案例。

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

于 2012-05-03T20:20:40.373 回答
1

很难回答所有示例数据的问题,因为我无法重新创建您的代码(缺少全局宏)。

[更新]让宏解析包含需要屏蔽的字符更加困难。贴一些可以执行的代码,可以提供更多帮助。

是宏引用的一个很好的链接。

有一个非常好的图表,详细说明了在不同情况下使用哪些宏屏蔽功能。

即使字符串中包含 % 或 & , %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)) ;
于 2012-05-03T18:43:45.490 回答