我想通過一個宏內串聯幾個變量/分隔符創建一個字符串:不一致的行爲串聯宏觀變量
%macro write_to_string();
%let delim = = ;
%let string = %sysfunc(catx(%str(),
&string, \,
step start,
%nrstr(%superq(delim)),
&etls_stepStartTime,
|,
output table,
%nrstr(%superq(delim)),
&SYSLAST,
|,
transform return code,
%nrstr(%superq(delim)),
&trans_rc));
%mend;
宏被稱爲在幾個轉換結束(SAS DI內),所以字符串不斷在最後附加文本。
如果將%nrstr(%superq(delim))
的每個實例替換爲其他分隔符,則:
表示上述宏的行爲與預期相同。但是通過上面的代碼,我得到一個0
,後面跟着最後一個字符串。
我很無知有關宏變量和函數我在努力瞭解
- 爲什麼分隔符的選擇似乎影響到的字符串是否被正確地附加
- 爲什麼宏觀變量有時需要與被引用前面的
&
有時不是。
任何幫助,非常感謝!
EDIT
在代碼輸入變量以上由SAS DI系統自動生成,並在作業中的每個變換之後復位。值看起來像
&etls_stepStartTime = 16FEB2017:17:25:37
&SYSLAST = WORK.MY_TABLE_NAME
&trans_rc = 0
這裏&trans_rc
值將指示錯誤/警告跑最後轉換的狀態。
因此,我期望的輸出(與&delim
可變的工作)將是\
分隔形式
step start = 16FEB2017:17:25:37 | output table = WORK.MY_TABLE_NAME | transform return code = 0
的值。如上所述,除非我將分隔符更改爲某個非保留字符常量,否則我得到的只是最後一個值(與上次轉換對應的值),前面的值爲0\
。
您可以發佈此代碼引用的所有宏變量的輸入值以及您所得到的結果和所需結果。 – Tom
嘿@湯姆。此處的宏變量由SAS DI系統自動生成,並根據調用它們的程序中的何時進行更改(系統會在每次轉換後設置值)。我會舉一個例子。 – Rookatu
DELIM值是否改變?還是你把它變成一個宏觀變量,因爲你試圖讓它工作?既然你只使用三次,可能會更容易沒有宏變量,只要把'='放在你想要的結果宏變量中。 – Tom