上篇博文有介绍SAS中用FILENAME PIPE方法获取某目录下所有指定类型的文件名称,今天介绍一下用FILENAME PIPE来获取某一目录下某种类型文件的最后修改时间。比如要获取程序所在目录下SAS数据集的最后修改时间,代码如下:
filename fdate pipe "ls -t ./*.sas7bdat | head -1";
data _null_;
infile fdate lrecl=32767;
input;
call symputx('filename', _INFILE_, 'L');
run;
filename fdate "&filename";
proc sql noprint;
select cats(put(MODATE, is8601dt.)) into :file_dt
from dictionary.extfiles
where FILEREF='FDATE'
;
quit;
filename fdate clear;
其中的-t
是指按修改时间来排序(倒序);head -1
指只输出输入结果的第一行。这个命令还可以用来获取某目录下某种类型文件的最新版本的文件名,宏程序如下:
%macro getfname(keyword=, type=);
filename fname pipe "ls -t ./*.&type | grep -i '&keyword' | head -1";
data _null_;
infile fname lrecl=32767;
input;
_INFILE_=prxchange("s/(.+)\/(.+)(\.&type)/\2/", -1, _INFILE_);
call symputx("fname", _INFILE_, "g");
run;
/* Close the pipe */
filename fname clear;
%mend getfname;
/*Using Example*/
%getfname(keyword=mapping specifications, type=xlsx)
顺便介绍一下如何获取某种类型文件所在的目录。方法如下:在上级目录通过find
命令查找所有目标类型文件,然后再提取文件的目录。以获取文件define.xml的目录为例,实现代码如下:
x 'cd /projects/study123456/';
filename fpath pipe "find . -name '*define*.xml' | head -1 | sed 's#.##'";
data _null_;
infile fpath lrecl=32767;
input;
call symputx('path', prxchange("s#(.+)/(.+?)$#/projects/study123456/\1/#", -1, cats(_INFILE_)));
run;
filename fpath clear;
其中-name
表示使用文件名模式来匹配文件;s#.##
表示将当前目录的点替换为空。