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

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,或任何当前日期的输入。换句话说,我需

我有一个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
,或任何当前日期的输入。换句话说,我需要在
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.));