SAS宏功能,以获取有关Linux文件的修改日期(SAS macro function to get

2019-10-23 04:20发布

在微距功能工作,返回文件作为SAS日期的修改日期,将在Linux(SAS 9.3)运行。 我想避免使用OS的命令(例如管道的LS命令的结果)作为代码需要与NOXCMD的环境中工作。 下面是第一草案(没有错误处理码,等等),使用FINFO()。

由日通过FINFO()返回的格式,如“周五4月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;

Answer 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如果你已经将它解析了一些手工的工作。

例如:

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


文章来源: SAS macro function to get file modified date on linux