String 连接宏变量的不一致行为
我试图通过在宏中串联多个变量/分隔符来创建字符串:String 连接宏变量的不一致行为,string,sas,sas-macro,String,Sas,Sas Macro,我试图通过在宏中串联多个变量/分隔符来创建字符串: %macro write_to_string(); %let delim = = ; %let string = %sysfunc(catx(%str( ), &string, \, step start, %nrstr(%superq(delim)),
%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;
在几个转换(在sasdi中)结束时调用宏,因此字符串的末尾会一直追加文本
如果将%nrstr(%superq(delim))
的每个实例替换为其他一些分隔符,:
例如,则上述宏的行为与预期相同。但是对于上面的代码,我得到一个0
,后面是最后一个附加的字符串
我对宏变量和函数非常无知,并且很难理解
- 为什么分隔符的选择似乎会影响字符串是否正确追加
- 为什么宏变量有时需要与前面的
一起引用,有时不需要李>&
&etls\u stepStartTime=2017年2月16日17:25:37
&SYSLAST=WORK.MY_TABLE_NAME
&trans\u rc=0
此处&trans_rc
的值将指示上次运行的转换的错误/警告状态
所以我想要的输出(使用&delim
变量工作)将是表单的值
step start=163feb2017:17:25:37 | output table=WORK.MY_table|u NAME | transform return code=0
由\
分隔。如上所述,除非我将分隔符更改为某个非保留字符常量,否则我得到的只是前一个0\
的最后一个值(对应于最后一次转换的值)。不要将%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。此处的宏变量由SAS DI系统自动生成,并根据在程序中调用它们的时间而变化(系统在每次转换后设置值)。我将发布一个示例。DELIM值是否更改?还是因为你想让它工作,所以你把它变成了一个宏变量?因为您只使用了三次,所以不使用宏变量可能更容易,只需将
=
放在生成的宏变量中所需的位置即可。嘿@Tom。我真的很感激你的回答。它不仅解决了我的问题,还解决了我面临的其他问题。宏对我来说是无止境的困惑,我永远不知道为什么某些东西会工作或不工作。谢谢