2012-05-03 79 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

相關問題