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

SAS macro function to get file modified date on linux

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

对 finfo() 编辑的 return 日期格式感到失望,例如 "Fri Apr 10 14:54:10 2015"。然后更失望的是我无法在没有下面丑陋的解析的情况下输入()这个字符串。过去我通常避免使用 ANYDTDTE informat,因为担心它会进行过多的猜测并且不会抛出错误。但是编写自定义日期时间信息格式来处理此字符串感觉有点矫枉过正。

对于将日期字符串转换为 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;

至少 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)

returns

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.)
     );