SAS宏函数在linux上获取文件修改日期

时间:2015-05-20 16:11:06

标签: linux sas sas-macro

使用宏函数将文件的修改日期作为SAS日期返回,该日期将在Linux(SAS 9.3)上运行。我想避免使用OS命令(例如管道LS命令的结果),因为代码需要在具有NOXCMD的环境中工作。下面是使用finfo()的初稿(没有错误处理代码等)。

对finfo()返回的日期格式感到失望,例如" Fri Apr 10 14:54:10 2015"。然后更失望的是我无法输入()这个字符串而没有下面的丑陋解析。我过去一般都避免使用ANYDTDTE信息,因为担心它会做太多的猜测并且不会抛出错误。但是编写一个自定义的日期时间信息以处理这个字符串感觉有些过分。

希望能够更好地将日期字符串转换为SAS日期,获取文件修改日期的更好方法以及下面的任何陷阱。

%macro GetModDate(file);
  %*Get the modified date of a linux file, as SAS date;
  %local rc fref fid ModDate;

  %let rc=%sysfunc(filename(fref,&file));
  %let fid=%sysfunc(fopen(&fref));

  %let ModDate=%sysfunc(finfo(&fid,Last Modified));

  %*Linux Last Modified returns format like: Fri Apr 10 14:54:10 2015;
  %let ModDate=%sysfunc(inputn(%scan(&moddate,2,%str( )) %scan(&moddate,3,%str( )) %scan(&moddate,5,%str( ))
                              ,anydtdte11
                               ));
  %let fid=%sysfunc(fclose(&fid));
  %let rc=%sysfunc(filename(fref));

  &ModDate
%mend GetModDate;

1 个答案:

答案 0 :(得分:1)

至少在Windows上不会发生这种情况。我得到了一个不错的SAS日期时间。

添加一些调试:

%macro GetModDate(file);
  %*Get the modified date of a linux file, as SAS date;
  %local rc fref fid ModDate;

  %let rc=%sysfunc(filename(fref,&file));
  %put &=rc;
  %let fid=%sysfunc(fopen(&fref));
  %put &=fid;
  %let ModDate=%sysfunc(finfo(&fid,Last Modified));
  %put &=ModDate;
  %*Linux Last Modified returns format like: Fri Apr 10 14:54:10 2015;
  %let ModDate=%sysfunc(inputn(%scan(&moddate,2,%str( )) %scan(&moddate,3,%str( )) %scan(&moddate,5,%str( ))
                              ,anydtdte11
                               ));
  %let fid=%sysfunc(fclose(&fid));
  %let rc=%sysfunc(filename(fref));

  &ModDate
%mend GetModDate;

%getModDate(c:\temp\test.html)

返回

RC=0
FID=2
MODDATE=19Mar2015:10:19:09

我不确定如果Linux以你想要的方式运行会有更好的方法,但是,如果你已经努力手动解析它,你可以做一些改进以避免ANYDTDTE。 / p>

例如:

%let ModDate=
    %sysfunc(inputn(
        %scan(&moddate,3,%str( ))%scan(&moddate,2,%str( ))%scan(&moddate,5,%str( )),
        date9.)
     );