我有一个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;
Run Code Online (Sandbox Code Playgroud)
我想改变它,使得它不会期望输入被命名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";
Run Code Online (Sandbox Code Playgroud)
但它生成的字符串就像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-:
___________________________________________
%let file = DT-
___________________________________________
我们现在可以从列表中排名第一!让我们淘汰#2.
两个函数将帮助我们按照我们想要的顺序得到它:
%sysfunc()today()我们将封装today()用%sysfunc().%sysfunc()让我们运行大多数非宏语言的SAS函数,并且还有一个额外的好处,就是使用额外的参数以您希望的格式返回值.这对我们非常有帮助.
那么,让我们把今天的日期作为数字SAS日期,然后将其转换为yymmddx10格式,其中x有一些delimiter关键字.我们将使用yymmddd10.- 即指定yyyy-mm-dd的格式.额外的d意思是冲刺.
___________________________________________
%let file = DT-%sysfunc(today(), yymmddd10.)
___________________________________________
2现在已经不在了.困难的部分结束了!我们需要做的就是追加.csv它,我们将全力以赴.
___________________________________________
%let file = DT-%sysfunc(today(), yymmddd10.).csv;
___________________________________________
您可以file使用%put语句确认宏变量的值:
%put NOTE: This is my filename: &file;
您应该在日志中看到绿色文本 NOTE: This is my filename: 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;
Run Code Online (Sandbox Code Playgroud)
现在,您已经有了一个动态的方式在这些CSV中读取,并且你可以在其他地方适应这个代码.很棒的酱.我想你已经为自己赢得了一杯庆祝咖啡,也许是一杯或两杯; 不要太疯狂.