在SAS中,我喜欢制作动态文件名,因为我每天都在浏览我的数据。
我试图在文件名中包含一个宏,如下所示:
%let date=input(put(today()-3,ddmmyy6.),6.); *This is equal to todays date-3 (format = 190317)
filename nlp "DailyB.DG%date";
你能帮帮我吗?
为了直观了解我喜欢做什么,我在下面发布了一个例子 我希望从今天开始减去3天的日期格式:DDMMYY(190317) 因此,如果我在200317之后的第二天运行代码。
然后应该将变量放入代码中,以便我得到以下内容:
filename nlp 'DailyB.DG190317';
答案 0 :(得分:1)
如果您想要宏变量来解析函数,则需要%sysfunc
。这是实现这一目标的一种方法。
%let date=%sysfunc(putn(%eval(%sysfunc(today())-3),ddmmyyn6.)); *This is equal to todays date-3 (format = 190317);
%put &=date;
第一个%sysfunc
要求today()
的结果,第二个要求格式化结果。需要%eval
从值中减去3,正如@Quentin在评论中指出的那样。
或者,如果您在数据步骤中感觉更舒服,call symputx
可以在这里工作。
data _null_;
call symputx('date',put(today()-3,ddmmyyn6.));
run;
%put &=date;
答案 1 :(得分:0)
您需要使用%sysfunc()和%eval()宏函数来评估Data Step之外的Data Step函数。正如乔所说:
%let date=%sysfunc(putn(%eval(%sysfunc(today())-3),ddmmyyn6.));
然后,您需要将%
更改为&
filename nlp "DailyB.DG&date";
答案 2 :(得分:0)
所以你目前尝试的最终会得到像
这样的文件名filename nlp "DailyB.DGinput(put(today()-3,ddmmyy6.),6.)";
要在宏代码中运行函数,您需要使用%SYSFUNC()
。您还需要使用PUTN()
函数,因为PUT()
函数不能与%SYSFUNC()
一起使用。
%let date=%sysfunc(putn(%sysfunc(today())-3,ddmmyyn6));
filename nlp "DailyB.DG&date";
如果您可以更改过程,我建议您使用8个字符作为名称的日期部分,以便包含世纪。此外,如果您使用日期字符串的年,月,日顺序,则生成的文件名将按正确的日期顺序排序,并且还会阻止用户将哥伦布日置于杜威十进制日期。