为什么在 sas 中解析宏时宏正在创建 Leading space?
why macro is creating Leading space while resolving macro in sas?
我正在提交以下 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 space 秒:
t_ 201504240150
这里的问题是当我的宏被解决时它正在创建前导 space。为什么要创建 spaces?
我的输出应该是:
t_201504240150
我知道解决方案,但只是想知道原因。
DATA _NULL_;
call symput("Today", strip(Put(datetime(),mysdt.)));
run;
调用 symputx 删除前导和尾部 space。
DATA _NULL_;
call symputx("Today", Put(datetime(),mysdt.));
run;
原因是您的格式设置了默认长度 14。因此,当您将值放入 &today
时,它会与前导空格一起存储以填充长度14. 来自 SAS 文档:
DEFAULT=length
specifies the default length of the picture. The value for DEFAULT= becomes the length of picture if you do not give a specific length when you associate the format with a variable.
因此,有多种选择:
设置默认格式长度以匹配日期时间值的预期长度(使用 DEFAULT=12):
proc format;
picture mysdt (default=12)
low-high = '%Y%0m%0d%0H%0M' (datatype =datetime);
run;
以您的格式指定宽度:
DATA _NULL_;
call symput("Today", strip(Put(datetime(),mysdt12.)));
run;
或者,如前所述,使用 call symputx
到 trim 空格:
DATA _NULL_;
call symputx("Today", strip(Put(datetime(),mysdt.)));
run;
就我个人而言,我会将格式固定为默认 12,这样您就无需每次都记住指定宽度或使用 call symputx
。
我正在提交以下 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 space 秒:
t_ 201504240150
这里的问题是当我的宏被解决时它正在创建前导 space。为什么要创建 spaces?
我的输出应该是:
t_201504240150
我知道解决方案,但只是想知道原因。
DATA _NULL_;
call symput("Today", strip(Put(datetime(),mysdt.)));
run;
调用 symputx 删除前导和尾部 space。
DATA _NULL_;
call symputx("Today", Put(datetime(),mysdt.));
run;
原因是您的格式设置了默认长度 14。因此,当您将值放入 &today
时,它会与前导空格一起存储以填充长度14. 来自 SAS 文档:
DEFAULT=length
specifies the default length of the picture. The value for DEFAULT= becomes the length of picture if you do not give a specific length when you associate the format with a variable.
因此,有多种选择:
设置默认格式长度以匹配日期时间值的预期长度(使用 DEFAULT=12):
proc format;
picture mysdt (default=12)
low-high = '%Y%0m%0d%0H%0M' (datatype =datetime);
run;
以您的格式指定宽度:
DATA _NULL_;
call symput("Today", strip(Put(datetime(),mysdt12.)));
run;
或者,如前所述,使用 call symputx
到 trim 空格:
DATA _NULL_;
call symputx("Today", strip(Put(datetime(),mysdt.)));
run;
就我个人而言,我会将格式固定为默认 12,这样您就无需每次都记住指定宽度或使用 call symputx
。