Sas 在文件名中包含宏

Sas 在文件名中包含宏,sas,Sas,在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

在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';

您需要使用%sysfunc()和%eval()宏函数来计算数据步骤之外的数据步骤函数。正如乔所说:

%let date=%sysfunc(putn(%eval(%sysfunc(today())-3),ddmmyyn6.));
然后您需要将
%
更改为
&

filename nlp "DailyB.DG&date"; 

如果需要宏变量解析函数,则需要
%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在注释中指出的那样

或者,如果您对数据步骤比较熟悉,
callsymputx
也可以在这里工作

data _null_;
  call symputx('date',put(today()-3,ddmmyyn6.));
run;
%put &=date;

因此,您当前尝试的结果将是一个filename语句,如

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个字符,这样您就可以包含世纪。此外,如果您对日期字符串使用年、月、日顺序,则生成的文件名将按正确的日期顺序排序,还可以防止用户将哥伦布日与杜威十进制日混淆。

我认为这还不够。应该需要%sysfunc。可能是%sysfunc(今天()-3,ddmmyy6.)。不知道这是否有效,或者需要%eval(今天()-3)。
%eval()
不需要。像PUTN()这样的SAS函数可以将表达式作为参数。