【问题标题】:Inconsistent behaviour concatenating macro variables连接宏变量的不一致行为
【发布时间】: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 次,因此没有宏变量可能会更容易,只需将 = 放在您想要的宏变量中。

标签: string sas sas-macro


【解决方案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 ;

【讨论】:

  • 嘿@Tom。我真的很感谢这个答案。它不仅解决了我的问题,还解决了我面临的其他问题。宏让我无休止地困惑,我永远不知道为什么某些东西有效或无效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
相关资源
最近更新 更多