【发布时间】:2017-02-17 09:09:11
【问题描述】:
我正在尝试通过在宏中连接多个变量/分隔符来创建字符串:
%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,后跟最后一个要附加的字符串。
我对宏变量和函数一无所知,很难理解
- 为什么分隔符的选择似乎会影响字符串是否正确附加
- 为什么宏变量有时需要用前面的
&引用,有时不需要。
非常感谢任何帮助!
编辑
上述代码中的输入变量由 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 系统自动生成,并根据在程序中调用它们的时间而变化(系统在每次转换后设置值)。我将发布一个示例。
-
DELIM 值有变化吗?或者你是不是因为你想让它工作而把它变成一个宏变量?由于您只使用了 3 次,因此没有宏变量可能会更容易,只需将
=放在您想要的宏变量中。