我试图通过在宏中连接几个变量/分隔符来创建一个字符串:
%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\
。
答案 0 :(得分: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 ;