SAS宏程序:通过CMD批量获取文件的修改时间

公司要求QC侧程序的运行要在Source侧之后,目前没有专门的工具检查程序运行时间,只能人工核查。但人工核查不仅繁琐,还难免会有疏漏。

于是,我打算写个宏程序来完成这项工作。基于模块化考虑,我先介绍获取文件修改时间的宏程序,后续的时间比较在另行操作。宏程序代码附在文章末尾

获取文件修改时间的主要思路是,通过电脑的CMD指令获取文件的修改时间,然后将指令的返回结果读入SAS数据集

1. CMD指令获取文件修改时间

以Win10系统为例,进行演示。Linux系统操作可能不同,后续研究再介绍。

首先,在搜索栏输入CMD,打开命令提示符。

CMD

获取文件夹的所用的命令是dir,我们可以输出dir /?查看该命令的帮助文档。

dir /?
dir help

在文档中可以发现,查看文件的时间相关信息,使用的是/t选项。选项有3个参数,分别对应创建时间、上次访问时间以及上次写入时间。

我测试了下,省略参数时,默认输出是上次写入时间,也就是想要获取的文件修改时间。

我新建了个Test文件夹,文件夹中包含SAS程序和SAS log文件。

SDTM

获取该文件夹下所有Log文件的修改时间的命令如下:

dir /t E:\99_Test\SDTM\*.log

*为通配符,可以匹配所有后缀为.log的文件。

命令的输出结果如下:

修改时间

该文件夹中,所有Log文件的修改时间都显示出来了,后面需要将这些结果读入到SAS中。

2. 将CMD返回结果导入SAS数据集

在SAS中,可以使用filename语句建立一个文件引用,与CMD指令的输出结果相关联。同时,必须使用pipe选项,SAS才能访问访问CMD指令的输出结果。

*Create a fileref for the files Modified datetime;
filename cmd pipe "dir /t E:\99_Test\SDTM\*.log";

文件引用建立好之后,在Data步中使用infile语句进行读取。考虑到输出结果中有4列内容,提前设置好保存这些结果的变量长度,避免截断。

*Read the fileref;
data tmp;
    length date $20 time $20 size $200 filenam $20 ;
    infile cmd;
    input date $ time $ size $ filenam $;
run;
Tmp

从结果中可以出,有一些多余的信息出现在读入数据集中前两行,和后两行。我们可以在Data步中进行移除,同时进行变量处理, 方便结果查看。

*Keep useful datetime information;
data tmp1;
  length folder $200 type $20;
  set tmp nobs = nobs;
        
  *remove useless information;
  if 2<_n_<nobs-2;

  format modifydt e8601dt.;
  modifydt = input(strip(date)||"T"||strip(time),e8601dt.);

  folder = "E:\99_Test\SDTM\";
  type = "log";

  keep folder type filenam modifydt;
run;

整理结果如下,该文件夹下的Log文件的修改时间输出完毕。

修改时间

3. 汇总宏程序

流程跑通之后,将程序整理成宏。

宏程序与前面代码相比,多了对路径宏参数的处理。因为输入路径时,并非所有人都习惯以斜杠\结尾,所以直接将斜杠写在Filename语句的路径中。

如果输入的宏参数多了斜杠,直接在宏程序的开头移去。这样就避免了路径输入不统一对宏运行的影响。

%macro modifydt(folder=,type=, outdt=);

*Remove trailing slash;
%if %substr(&folder.,%length(&folder.),1)=\ %then %let folder=%substr(&folder.,1,%length(&folder.)-1);

*Create a fileref for the files Modified datetime;
filename cmd pipe "dir /t &folder.\*.&type.";

*Read the fileref;
data &outdt.1;
    length date $20 time $20 size $200 filenam $20 ;
    infile cmd;
    input date $ time $ size $ filenam $;
run;

*Keep useful datetime information;
data &outdt.;
    length folder $200 type $20;
    set &outdt.1 nobs = nobs;
        
    *remove useless information;
    if 2<_n_<nobs-2;

    format modifydt e8601dt.;
    modifydt = input(strip(date)||"T"||strip(time),e8601dt.);

    folder = "&folder.";
    type = "&type.";

    keep folder type filenam modifydt;
run;
%mend modifydt;

%modifydt(
    folder=%str(E:\99_Test\SDTM\)
    ,type=log
    ,outdt=log
);

总结

文章介绍了,通过SAS读取CMD命令的返回结果,获取文件夹中特定类型文件的修改时间。

目前以上程序适用于win10系统,如果电脑系统语言为中文,指令输出结果中包含中文字符。如果当前SAS编码环境不支持中文,则会导入错误。

最后贴一下,我演示用的SAS中文的编码设置:

%put %sysfunc(getoption(encoding));
%put %sysfunc(getoption(locale));
编码设置 中文

英文版的编码设置如下,可以正常导入CMD结果。

编码设置 英文

SAS EG编码设置如下,无法正常导入CMD指令结果:

编码设置 EG
Error

感谢阅读!若有疑问,欢迎评论区交流!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容