文本包含不匹配的引号。(SAS)

文本包含不匹配的引号。(SAS),sas,sas-macro,Sas,Sas Macro,我试图获取在宏变量中传递的值,并在其周围加上引号。i、 e.空格分隔列表到空格分隔引用列表。e、 g.如下所示。我使用了Jeff在我之前的一篇文章中给出的以下方法 data test; id =1; _var="ABC"; output; id =1; _var="DEF"; output; id =1; _var="UVW"; output; id =2; _var="UVW"; output; id =3; _var="ABC"; output; id =

我试图获取在宏变量中传递的值,并在其周围加上引号。i、 e.空格分隔列表到空格分隔引用列表。e、 g.如下所示。我使用了Jeff在我之前的一篇文章中给出的以下方法

data test;
   id =1; _var="ABC"; output;
   id =1; _var="DEF"; output;
   id =1; _var="UVW"; output;
   id =2; _var="UVW"; output;
   id =3; _var="ABC"; output;
   id =3; _var="UVW"; output;
   id =3; _var="XYZ"; output;
   id =4; _var="ABC"; output;
   id =4; _var="XYZ"; output;
run;

%macro __test1(_byvar=, _qnam=, _id=);
    proc sort data= test out=_test;
        by &_byvar.;

  %if %superq(_qnam) ne %then
  %do; 
            %let __tmpmv_qnam = %qsysfunc(prxchange(%bquote(s/\b/"/),-1,%bquote(&_qnam))); 
            *";
            %put ^^^^^&__tmpmv_qnam.;
      where upcase(&_id) in (&__tmpmv_qnam);
  %end;

    run;

%mend;

%__test1 (_byvar=id ,_qnam = ABC UVW, _id=_var);
日志显示了以下错误:

SYMBOLGEN:  Macro variable _QNAM resolves to ABC UVW  
ERROR: Literal contains unmatched quote.

请对此提供帮助。

这里有一种添加引号的替代方法。它非常基本-它不检查输入是否已被引用,列表项之间必须正好有1个空格,输入列表中不得有前导空格或尾随空格,但您可以调整它以满足您的需要:

%let list = a b c;
%macro qlist(LIST);
%sysfunc(compbl(
%do i = 1 %to %eval(%sysfunc(count(&LIST, %str( ))) + 1);
    "%scan(&LIST,&i)" %str( )
%end;
))
%mend qlist;

%put %qlist(&list);

您可以使用以下函数在宏中使用不匹配的引号:

%str(%')         <-- gives an unmatched single quote
%str(%")         <-- gives an unmatched double quote

你似乎让问题变得更难了。为什么不直接使用
INDEXW()
函数呢

where indexw(symget('_qnam'),upcase(&_id),' ');
或者,如果要将
ABC UVW
转换为
“ABC”,“UVW”
,则只需调用一个简单的
TRANWRD()
函数即可

where upcase(&_id) in ("%sysfunc(tranwrd(&_qnam,%str( ),","))");
但是,如果您的列表可能有额外的空格,例如,如果它是手工键入的,您将希望首先删除额外的空格

%let _qnam=%sysfunc(compbl(&_qnam));
%let _qnam=%sysfunc(compbl(&_qnam));