2014-08-27 67 views
5

我只是試圖連接兩個引用的宏變量,但似乎並沒有一個簡單的方法。連接引用的宏變量

說我們有:

%LET VAR1="This is not the greatest song in the world"; 
%LET VAR2="this is just a tribute."; 

%LET TRIBUTE=%SYSFUNC(CATX(%STR(),&VAR1,&VAR2)); 
%PUT &TRIBUTE; 

其實我是想:

"This is not the greatest song in the world this is just a tribute." 

但上面的代碼實際上產生:

"This is not the greatest song in the world" "this is just a tribute." 

所以我嘗試把%QUOTE()%BQUOTE等。大約在&VAR1%VAR2希望揭開引號,但我得到了同樣的結果。

爲我的作品的唯一事情是:

%LET TRIBUTE="%SUBSTR(&VAR1.,2,%LENGTH(&VAR1.)-2) %SUBSTR(&VAR2.,2,%LENGTH(&VAR2.)-2)"; 

但是,這是醜陋的,並能得到長時間的真快。 有沒有更好的方法來做到這一點?

回答

2

您可以使用COMPRESS來執行此操作。

%LET VAR1="This is not the greatest song in the world"; 
%LET VAR2="this is just a tribute."; 


%let VAR3=%sysfunc(compress(&VAR1,%str(%"))); 
%put &=var1 &=var3; 

刪除引號是有點棘手,但它的工作原理。

您也可以在FCMP函數或函數式宏中執行此操作;這裏是一個例子。

%macro unquote_string(string=); 
%sysfunc(compress(&string.,%str(%'%"))) 
%mend unquote_string; 

%let VAR3="%unquote_string(string=&var1.) %unquote_string(string=&var2.)"; 
%put &=var3.; 

請注意,您不應該使用CAT函數來連接宏變量。它們只是文本,所以一個接一個地輸入就可以自動連接它們。

但是,對於'有沒有更好的方法'這個問題的真正答案是,不要將引號存儲在宏變量中。大多數情況下,您應該存儲宏變量w/o引號,並在需要時在引號中使用它。 SAS宏不像任何特殊的東西一樣尊重引號 - 它們只是字符串中的一個字符 - 所以他們沒有專門的工具來處理這個問題。

+0

兩件事...首先 - 我不知道'&='語法 - 謝謝!其次,你可以簡化你的var3賦值爲'%let VAR3 =「%unquote_string(string =&var1&var2。)」;'。 – 2014-08-27 20:10:35

+0

你絕對可以這樣簡化它。不過,我更喜歡上面的內容,因爲它更清楚您要刪除的引用內容 - 與「%UNQUOTE」的工作方式類似,與宏引用相似。 (如果這些是宏觀引用的mvars,我認爲你必須調用它兩次)。 – Joe 2014-08-27 20:12:06

+0

實際上,現在我想到了它,這是一個什麼時候創建FCMP函數或宏函數的壞例子,因爲您只是將調用包裝到現有函數中......也可以直接調用函數。 – 2014-08-27 20:12:08

4

我打算把喬的'真實答案'解釋爲 - 不要在宏變量中存儲引號。宏語言中的單引號和雙引號與任何其他字符沒有區別。你應該做的是延遲引入報價,直到你真正需要它們。這將導致更清潔,更靈活,更易於閱讀和無缺陷的代碼。

代碼:

通知我已刪除了報價,並串連我只是列出他們一個接一個的字符串:

%LET VAR1=This is not the greatest song in the world; 
%LET VAR2=this is just a tribute.; 
%LET TRIBUTE=&VAR1 &VAR2; 

例1

由於我們在第一個示例中使用了%put語句,因此不需要引號來打印所需的字符串 - 因此,我將引號留在了外面:

%PUT &TRIBUTE; 

輸出:

This is not the greatest song in the world this is just a tribute. 

實施例2

報價必需的,因爲我們現在在數據步驟土地:

data _null_; 
    put "&TRIBUTE"; 
run; 

輸出:

This is not the greatest song in the world this is just a tribute. 

請注意,這兩個示例都假設您並不想將報價打印到屏幕上。

+0

通常我會避免在宏變量中引用引號,但是,我有幾個常用宏req使用可能包含或不包含逗號的參數。這可能會導致位置參數錯誤(如果沒有引用),所以按照規則,無論何時寫入這些宏,我都需要引用這些參數,以確保安全。但是,我可能想要在宏觀主體或者什麼都沒有的情況下進行連接,這就是我的問題發揮的地方。 – Pane 2014-08-28 14:03:47

+1

處理逗號以避免您描述的問題的正確方法是使用'%bquote()'宏函數包裝值。 – 2014-08-28 15:21:09

+0

@Pane事實上,引號字符不應該用於此目的。 – Joe 2014-08-28 15:22:44