为什么宏在sas中解析宏时创建前导空格?

为什么宏在sas中解析宏时创建前导空格?,sas,sas-macro,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; 结果日志显示日期时间前的2个空格: t_ 201504240150 这里的问题是,当我的宏被解决时,它

我正在提交以下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;
结果日志显示日期时间前的2个空格:

t_  201504240150
这里的问题是,当我的宏被解决时,它正在创建前导空间。为什么要创造空间

我的输出应该是:

t_201504240150
我知道解决办法,但只是想知道原因

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

调用symputx删除前导和尾随空间

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

原因是您的格式设置为默认长度14。因此,当您将您的值放入
&今天的
时,它会用前导空格存储,以将长度填充到14。从SAS文档中:

默认值=长度

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

因此,有很多选择:

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

以您的格式指定宽度:

DATA _NULL_;
  call symput("Today", strip(Put(datetime(),mysdt12.)));
run;
或者,如前所述,使用
call symputx
修剪空白:

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

就我个人而言,我会将格式修改为默认值12,这样您就不必记得每次都指定宽度或使用
call symputx

在t_u和201504240150之间。我只是想知道为什么它会创造空间??我没有这方面的专业知识,但请相应地更新您的问题。
DATA _NULL_;
  call symputx("Today", strip(Put(datetime(),mysdt.)));
run;