SAS获取某目录下某种类型文件最后修改时间

上篇博文有介绍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#.##表示将当前目录的点替换为空。

曾宪华 /
本文采用 署名-非商业性使用-相同方式共享 3.0许可协议 属于 程序人生 分类, 被贴了 FILENAME PIPE sed 书签

上一篇 SAS获取某目录下所有指定类型的文件名称
下一篇 水墨乡村-宏村