SASmacrosfunction在linux上获取文件修改date

使用macros函数将文件的修改date作为SASdate返回,这将在Linux(SAS 9.3)上运行。 我想避免使用操作系统命令(例如,输送LS命令的结果),因为代码需要在具有NOXCMD的环境中工作。 下面是使用finfo()的初稿(没有error handling代码等)。

对finfo()返回的date格式感到失望,例如“2014年4月10日14:54:10”。 然后,我更加失望的是,我无法input()这个string没有下面的丑陋parsing。 过去我一般都避免使用ANYDTDTE信息,因为它担心猜测太多,不会出错。 但是写一个自定义的date时间信息来处理这个string感觉就像是矫枉过正。

希望能有更好的方法将datestring转换为SASdate,更好的方法来获取文件修改date,以及任何陷阱下面。

%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) 

回报

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