2012-05-03 56 views
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(); 

我希望代码是自我记录。 我会解释这里的问题。 一切工作正常,直到我传递给用来显示变量的模态的程序的第二个。无与伦比的引号SAS

例如,当在宏变量被放养模式的名称都像
$ 100%BLO,
100%的色,
AVON & RAGOBERT,
百龄坛,
L'OREAL,
AT & T,
UVA
etc
我无法正确使用%放。 我试过使用%bquote和%nrstr,但问题依然存在。 到目前为止,我能看到的唯一解决方案是修改模式的名称,但由于名称来自客户端,因此我无法对数据进行修改。

谢谢

回答

2

尝试了几次后,我发现%superq可以解决这个问题,在宏观麻烦处理特殊字符,这page提供宏观一些有用的技巧报价

我简化。你的 代码如下

UPDATE:使它成为双循环的情况。

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接受宏变量名称而没有额外的&符号。

+0

奇怪的是这个工程。我这样说是因为我记得使用%superq,但我仍然有一些错误。当我明天尝试再次调试程序时,我会给你反馈。谢谢 – afiqjohari

+0

不错...我很惊讶%superq解决了&j。 –

+0

我刚刚要调试程序。当我只在模态上循环时(j = 1到numMod),程序运行良好。到目前为止,%superq()能够完成它的工作。但是,当我尝试向此添加另一个循环时,意思是(i = 1到numVar),%superq()无法解释%&& tableb&i.modal&j。正确。 – afiqjohari

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)) ; 
+0

感谢您的回复。 我目前没有工作,所以我很难给你必要的全局宏来重新创建代码。 顺便说一句,通常你的%测试应该运行良好,除了在我的情况下,我不能修改变量模式的名称,如L'OREAL到L%'OREAL。 – afiqjohari

相关问题