2014-10-30 96 views
1

我想用帶空格的雙引號(即「」)替換宏變量中傳遞的變量之間的空格。請在下面找到我使用的代碼和我得到的結果。使用帶空格的引號替換宏變量值中的空格

%let str7=ABC DEF UVW XYZ; 

%let str8 = %qsysfunc(quote(%qsysfunc(tranwrd(%qsysfunc(compbl(%qsysfunc(strip(%upcase(&str7.))))),%str(),%nrstr(%"))))); 

%put ^^^^&str8; 

的日誌顯示:

18 %put ^^^^&str8;

^^^^"ABC""DEF""UVW""XYZ"

我需要這是 「ABC」, 「DEF」 「UVW」 「XYZ」。

我也曾嘗試以下...

proc fcmp outlib=work.funcs.funcs; 

    function delimit_words(iString $) $;  
    result = '"' || tranwrd(cats(compbl(iString))," ", '" ,"') || '"';  
    return (result); 
    endsub; 

run; 


%let x = A B C ; 
%let y = %sysfunc(delimit_words(&x)); 
%put &y; 

,但它給了我下面的錯誤...

錯誤:在%SYSFUNC或%QSYSFUNC宏函數引用的DELIMIT_WORDS功能不找到。

我已經使用了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); 

日誌diaplayed以下錯誤:

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

請在這一個幫助。

回答

0

無需調試上述任一你的方法,我可以提供第三:

%let str8 = %sysfunc(prxchange(%bquote(s/\b/"/),-1,%quote(&str7.))); 
*"; 

prxchange()函數告訴SAS與"更換每一個字邊界(\b)。至於什麼時候使用bquote(),而不是quote(),它都在線記錄,但老實說,我通常訴諸試驗和錯誤。

*";什麼都不做,但如果編輯器的語法突出顯示會被單引號混淆(就像我的做法一樣),它會讓事情看起來更好。

+0

感謝您使用更整潔的方法,但它給了我以下錯誤。錯誤:文字包含無與倫比的報價。 – 2014-10-30 14:38:00

+0

我有一個錯字,現在修正了(buote而不是quote)。對於那個很抱歉。 – Jeff 2014-10-30 14:39:26

+0

是的。我明白了,但錯誤依然存在。 – 2014-10-30 14:46:41

1

FCMP如果添加行

options cmplib=work.funcs; 

你的代碼,如果你在SAS 9.3或更高版本上運行工作正常。

一般來說,最好的方法是不要這樣做:相反,首先使用引號創建宏變量。你是如何創造這個的?如果從數據集創建它,例如,你可以這樣做:

proc sql; 
    select quote(strip(name)) into :varlist separated by ',' 
    from sashelp.class; 
quit; 

返回

"Alfred","Alice","Barbara","Carol","Henry","James","Jane","Janet","Jeffrey","John","Joyce","Judy" ,"Louise","Mary","Philip","Robert","Ronald","Thomas","William"

0

試試這個:

%let str7=ABC DEF UVW XYZ; 

%let str8 ="%bquote(%sysfunc(tranwrd(%sysfunc(strip(&str7.)),%str(),%nrstr(%",%"))))"; 

%put ^^^^&str8; 
0

只要你想使用雙引用,那麼我認爲你工作太辛苦了。

%let str7=ABC DEF UVW XYZ; 
%let str8="%sysfunc(tranwrd(&str7,%str()," "))"; 

現在,如果您的原始字符串沒有很好地形成,並可能包含單詞之間的空格multple那麼你首先需要使用%COMPBL()把它清理乾淨。

%let str8=%sysfunc(compbl(&str7)); 
%let str8="%sysfunc(tranwrd(&str8,%str()," "))";