不匹配的引号SAS

不匹配的引号SAS,sas,Sas,我希望代码是自我记录的。 我将在这里解释这些问题。 在我转到程序的第二部分之前,一切都很正常,第二部分通过变量显示模式 例如,当储存在宏变量中的模式名称类似于 $100%BLO, 100%颜色, 雅芳和拉戈伯特, 百龄坛, 欧莱雅, AT&T, U-V-A etc 我无法正确使用%put。 我已尝试使用%bquote和%nrstr,但问题仍然存在。 到目前为止,我能看到的唯一解决方案是修改模式的名称,但由于名称来自客户,我无法对数据进行修改 谢谢很难回答所有示例数据的问题,因为我无法重新创建代码

我希望代码是自我记录的。 我将在这里解释这些问题。 在我转到程序的第二部分之前,一切都很正常,第二部分通过变量显示模式

例如,当储存在宏变量中的模式名称类似于
$100%BLO,
100%颜色,
雅芳和拉戈伯特,
百龄坛,
欧莱雅,
AT&T,
U-V-A
etc
我无法正确使用%put。 我已尝试使用%bquote和%nrstr,但问题仍然存在。 到目前为止,我能看到的唯一解决方案是修改模式的名称,但由于名称来自客户,我无法对数据进行修改


谢谢

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

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

是宏引用的良好链接

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

%Str即使在字符串中包含%或-,只要后跟空格,也可以工作。%NRSTR,如果其中一个可以解释为宏变量或宏调用。 可以在单引号(')或单双引号(“)前面加百分号(%),也可以使用BQUOTE或NRBQUOTE(如果字符串包含&或%)

这里是一个开始[更新]

%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();

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

我将您的代码简化为以下内容

更新:使其成为双循环的情况

%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)) ;
结果将正确显示


请注意,它是
%superq(tableb&i.modal&j)
而不是
%superq(&&tableb&i.modal&j)
as
superq
接受宏变量名,无需额外的符号。

谢谢您的回复。我目前不在工作,所以我很难给您必要的全局宏来重新创建代码。顺便说一句,通常情况下,您的%测试应该运行良好,但在我的情况下,我无法修改变量名像欧莱雅到L%'欧莱雅这样的模式。奇怪的是,这很有效。我这么说是因为我记得使用了%superq,但我仍然有一些错误。我明天在工作中再次尝试调试程序时会给你反馈。谢谢你,我刚刚要调试程序。当我只在模式上循环(j=1到numMod)时,程序运行得很好。到目前为止,%superq()能够完成它的工作。但是,当我尝试向它添加另一个循环时,这意味着(I=1到numVar),%superq()无法正确解释%&&tableb&I.modal&j。我想这是因为%superq的双符号和fails@afiqjohari使用
%superq(表B&i.modal&j)
而不是
%superq(&&table B&i.modal&j)
。我对代码进行了一些修改,使其包含了双循环。看到它确实起了作用!真是一种解脱。但我知道它会引出一个问题,即%superq(tableb&I.modal&j)和%superq(tableb&I.modal&j)是如何由宏SAS处理的?无论如何,您刚才为我节省了很多时间。非常感谢!
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();