2017-02-17 46 views
0

我想通過一個宏內串聯幾個變量/分隔符創建一個字符串:不一致的行爲串聯宏觀變量

%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\

+0

您可以發佈此代碼引用的所有宏變量的輸入值以及您所得到的結果和所需結果。 – Tom

+0

嘿@湯姆。此處的宏變量由SAS DI系統自動生成,並根據調用它們的程序中的何時進行更改(系統會在每次轉換後設置值)。我會舉一個例子。 – Rookatu

+0

DELIM值是否改變?還是你把它變成一個宏觀變量,因爲你試圖讓它工作?既然你只使用三次,可能會更容易沒有宏變量,只要把'='放在你想要的結果宏變量中。 – Tom

回答

1

請勿將%SYSFUNC()與CAT ...系列函數一起使用。首先,您不需要宏代碼,只需將文本放在您想要的地方即可。其次,因爲這些函數可以用於數字或字符參數。這意味着SAS必須嘗試確定您的宏代碼生成的文本是否代表數字或字符串。這可能是等號爲零的原因。 SAS將等號視爲平等測試,因此零意味着每邊的值不相等。

%let string =&string \ step start &delim &etls_stepStartTime ; 
%let string =&string | output table &delim &SYSLAST ; 
%let string =&string | transform return code &delim &trans_rc ; 
+0

嘿@湯姆。我非常感謝這個答案。它不僅解決了我的問題,還解決了我面臨的其他問題。宏對我來說無休止地困惑,我永遠不知道爲什麼有些事情可行。謝謝! – Rookatu