使用%PUT正确格式化动态文件名

Mer*_*rik 2 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;
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

换句话说,尾随零不在那里.我做错了什么?

Stu*_*ski 6

您需要使用宏变量或一大组宏函数(无论您想要哪个).为了便于阅读,我们将创建宏变量.根据您所说的内容,我们了解了有关模式的一些信息:

  1. 它始于 DT-
  2. 它有今天的yyyy-mm-dd格式日期
  3. 它结束了 .csv

其中两个是静态值,一个需要以特定格式动态.让我们开始吧.

首先将路径存储在自己的宏变量中.这使得代码更适用于其他应用程序(即,您可以复制/粘贴新代码的旧代码!在编程世界中懒得很好).

%let path = \\path\data;

接下来,让我们使用%let语句构建动态模式.我们知道它始于DT-:

___________________________________________

%let file = DT-

___________________________________________

我们现在可以从列表中排名第一!让我们淘汰#2.

两个函数将帮助我们按照我们想要的顺序得到它:

  1. %sysfunc()
  2. 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中读取,并且你可以在其他地方适应这个代码.很棒的酱.我想你已经为自己赢得了一杯庆祝咖啡,也许是一杯或两杯; 不要太疯狂.