为什么宏在sas中解析宏时创造领先空间?

Bha*_*ath 2 sas sas-macro

我提交以下SAS代码:

 proc format;
   picture mysdt
   low-high = '%Y%0m%0d%0H%0M' (datatype =datetime);
  run;

 DATA _NULL_;
   call symput("Today", Put(datetime(),mysdt.));
 run;

 %put t_&today;
Run Code Online (Sandbox Code Playgroud)

生成的日志在日期时间之前显示2个空格:

t_  201504240150
Run Code Online (Sandbox Code Playgroud)

这里的问题是当我的宏被解析时它正在创建前导空间.为什么要创造空间?

我的输出应该是:

t_201504240150
Run Code Online (Sandbox Code Playgroud)

我知道解决方案,但只是想知道原因.

DATA _NULL_;
  call symput("Today", strip(Put(datetime(),mysdt.)));
run;
Run Code Online (Sandbox Code Playgroud)

mjs*_*squ 5

这样做的原因是您的格式设置为默认长度14.因此,当您将值放入&today其中时,将使用前导空格存储以将长度填充为14.从SAS文档:

DEFAULT =长度

指定图片的默认长度.如果在将格式与变量关联时未指定特定长度,则DEFAULT =的值将成为图片的长度.

所以,有很多选择:

设置默认格式长度以匹配日期时间值的预期长度(使用DEFAULT = 12):

proc format;
  picture mysdt (default=12)
  low-high = '%Y%0m%0d%0H%0M' (datatype =datetime);
run;
Run Code Online (Sandbox Code Playgroud)

以您的格式指定宽度:

DATA _NULL_;
  call symput("Today", strip(Put(datetime(),mysdt12.)));
run;
Run Code Online (Sandbox Code Playgroud)

或者,如前所述,用于call symputx修剪空白:

DATA _NULL_;
  call symputx("Today", strip(Put(datetime(),mysdt.)));
run;
Run Code Online (Sandbox Code Playgroud)

就个人而言,我将格式修改为默认为12,然后您不需要记住指定宽度或call symputx每次使用.