连接宏变量的行为不一致

时间:2017-02-17 00:47:12

标签: string sas sas-macro

我试图通过在宏中连接几个变量/分隔符来创建一个字符串:

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

1 个答案:

答案 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 ;