使用宏函数将文件的修改日期作为SAS日期返回,该日期将在Linux (SAS9.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;发布于 2015-05-20 17:16:46
至少在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,那么您可以做一些改进来避免ANYDTDTE。
例如:
%let ModDate=
%sysfunc(inputn(
%scan(&moddate,3,%str( ))%scan(&moddate,2,%str( ))%scan(&moddate,5,%str( )),
date9.)
);https://stackoverflow.com/questions/30355046
复制相似问题