连接宏变量的不一致行为
Inconsistent behaviour concatenating macro variables
我正在尝试通过在宏中连接多个 variables/delimiters 来创建一个字符串:
%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;
宏在几个 t运行sformation 的末尾被调用(在 SAS DI 中),因此字符串在末尾附加了文本。
如果 %nrstr(%superq(delim))
的每个实例都被替换为其他定界符,例如 :
,那么上述宏将按预期运行。但是使用上面的代码,我得到一个 0
后跟最后一个要附加的字符串。
我对宏变量和函数一窍不通运行,很难理解
- 为什么分隔符的选择似乎会影响字符串是否正确附加
- 为什么宏变量有时需要用前面的
&
引用有时不需要。
非常感谢任何帮助!
编辑
上面代码中的输入变量由 SAS DI 系统自动生成,并在作业中的每个 t运行 信息后重置。这些值看起来像
&etls_stepStartTime = 16FEB2017:17:25:37
&SYSLAST = WORK.MY_TABLE_NAME
&trans_rc = 0
此处&trans_rc
的值将表示运行最后一个运行信息的error/warning状态运行。
所以我想要的输出(使用 &delim
变量)将是
形式的值
step start = 16FEB2017:17:25:37 | output table = WORK.MY_TABLE_NAME | transform return code = 0
由 \
分隔。如上所述,除非我将分隔符更改为某个非保留字符常量,否则我得到的只是最后一个值(对应于最后一个 t运行sformation 的值)和前面的 0\
。 =23=]
不要将 %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 ;
我正在尝试通过在宏中连接多个 variables/delimiters 来创建一个字符串:
%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;
宏在几个 t运行sformation 的末尾被调用(在 SAS DI 中),因此字符串在末尾附加了文本。
如果 %nrstr(%superq(delim))
的每个实例都被替换为其他定界符,例如 :
,那么上述宏将按预期运行。但是使用上面的代码,我得到一个 0
后跟最后一个要附加的字符串。
我对宏变量和函数一窍不通运行,很难理解
- 为什么分隔符的选择似乎会影响字符串是否正确附加
- 为什么宏变量有时需要用前面的
&
引用有时不需要。
非常感谢任何帮助!
编辑
上面代码中的输入变量由 SAS DI 系统自动生成,并在作业中的每个 t运行 信息后重置。这些值看起来像
&etls_stepStartTime = 16FEB2017:17:25:37
&SYSLAST = WORK.MY_TABLE_NAME
&trans_rc = 0
此处&trans_rc
的值将表示运行最后一个运行信息的error/warning状态运行。
所以我想要的输出(使用 &delim
变量)将是
step start = 16FEB2017:17:25:37 | output table = WORK.MY_TABLE_NAME | transform return code = 0
由 \
分隔。如上所述,除非我将分隔符更改为某个非保留字符常量,否则我得到的只是最后一个值(对应于最后一个 t运行sformation 的值)和前面的 0\
。 =23=]
不要将 %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 ;