Sas 使用%PUT正确格式化动态文件名
我有一个SAS脚本,它读取CSV文件并将其存储在SAS数据集中:Sas 使用%PUT正确格式化动态文件名,sas,Sas,我有一个SAS脚本,它读取CSV文件并将其存储在SAS数据集中: LIBNAME IN '\\path\Data'; FILENAME CSV '\\path\Data\DT.csv'; DATA IN.DT; INFILE CSV DLM=',' DSD FIRSTOBS=1; INPUT KEY VALUE1 VALUE2; RUN; 我想对其进行更改,以使其不希望输入名为DT.csv,而是接受名为DT-2016-03-03-TEST.csv,或任何当前日期的输入。换句话说,我需
LIBNAME IN '\\path\Data';
FILENAME CSV '\\path\Data\DT.csv';
DATA IN.DT;
INFILE CSV DLM=',' DSD FIRSTOBS=1;
INPUT KEY VALUE1 VALUE2;
RUN;
我想对其进行更改,以使其不希望输入名为DT.csv
,而是接受名为DT-2016-03-03-TEST.csv
,或任何当前日期的输入。换句话说,我需要在FILENAME
语句中使用动态值
以下是我到目前为止的情况:
%LET curday = %SYSFUNC(day("&sysdate"d));
%LET curmonth = %SYSFUNC(month("&sysdate"d));
%LET curyear = %SYSFUNC(year("&sysdate"d));
%PUT %SYSFUNC(PUTN(&curday, z2.));
FILENAME CSV "\\path\Data\DT-&curyear-&curmonth-&curday-TEST.csv";
但它生成的字符串类似于Data\DT-2016-3-3-TEST.csv
,而不是Data\DT-2016-03-03-TEST.csv
换句话说,后面的零不存在。我做错了什么?您需要使用一个宏变量或一大组宏函数(以您喜欢的为准)。为了便于阅读,我们将创建宏变量。根据你所说的,我们知道一些关于模式的事情:
DT-
yyyy-mm-dd
格式显示今天的日期.csv
%let path=\\path\data代码>
接下来,让我们使用%let
语句构建我们的动态模式。我们知道它以DT-
开头:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
%let file=DT-
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我们现在可以从名单上划掉1个!我们干掉2号吧
有两个函数将帮助我们按照所需的顺序实现这一点:
%sysfunc()
today()
我们将用%sysfunc()
封装today()
<代码>%sysfunc()
允许我们运行大多数非宏语言SAS函数,并且还具有使用附加参数以所需格式返回值的附加好处。这对我们这里真的很有帮助
因此,让我们将今天的日期作为数字SAS日期,然后将其转换为yymmddx10
格式,其中x
是一些分隔符关键字。我们将使用yymmdd10.
-即指定yyyy-mm-dd的格式。额外的d
表示破折号
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
%let file=DT-%sysfunc(今天(),yymmddd10。)
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
2现在已经不碍事了。难的部分结束了!我们所需要做的就是将.csv
附加到它,我们就都准备好了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
%let file=DT-%sysfunc(今天(),yymmddd10。).csv代码>
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
您可以使用%put
语句确认宏变量文件的值:
%put注意:这是我的文件名:&file代码>
您应该在日志中看到绿色文本注意:这是我的文件名:DT-2016-03-03.csv
现在,我们将把这一切放在一起:
%let path = \\path\data;
%let file = DT-%sysfunc(today(), yymmddd10.).csv;
libname IN "&path";
filename CSV "&path\&file";
data in.DT;
infile csv dlm=',' dsd firstobs=1;
input key value1 value2;
run;
您现在有了一种动态的方式来读取这些CSV,并且可以在其他地方修改这些代码。令人敬畏的酱汁。我想你已经为自己赢得了一杯庆祝性的咖啡,也许还有一两杯比斯科提酒;不要太疯狂。斯图的回答绝对正确。对于tl;博士版本
%put
将内容回显到日志中。您所做的只是将%SYSFUNC(PUTN(&curday,z2.))
的结果“放入”日志中。您没有更新&curday
中的值
试一试
对另一个curmonth
也这样做
花点时间阅读斯图的答案。太棒了!解释得很好,回答得很好。一个小提示:你的意思是filename CSV
对吗?另外,作为旁白,OP可能会把z2.
放在原始代码中(尽管你的方式明显更好)。很好,乔。是的,我想把文件名:)我更新了。
%LET curday = %SYSFUNC(PUTN(&curday, z2.));