2014-11-01 1 views
1

Я пытаюсь получить значения, переданные в макропеременной, и поместить туда кавычки. т.е. пространственно разделенный список в пробел, заключенный в кавычки. например нижеприведенный. Я использовал следующий подход, данный Джеффом в одном из моих ранних сообщений.Literal содержит непревзойденную цитату. (SAS)

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

Бревно diaplayed следующее сообщение об ошибке:

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

Пожалуйста, помогите с этим.

ответ

1

Вот альтернативный подход к добавлению котировок. Это довольно просто - он не проверяет, уже введен ли вход, и должно быть ровно 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); 
0

Вы можете иметь непревзойденную кавычки в макрос с помощью функции %str() следующим образом:

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

Я применил это макрос и реорганизованы/упрощена это немного. Во-первых, вы увидите, что я удалил избыточные функции %bquote() и изменил %qsysfunc() на %sysfunc().

Я также строю строку для предложения where и сохраняю ее в макропеременной, чтобы оператор сортировки выделялся больше, а результат предложения where легче отлаживать.

0

Вы, кажется, делаете проблему сложнее, чем она есть. Почему бы просто не использовать функцию 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));