1. 目的
獲取文件末次修改時(shí)間屹堰,可以進(jìn)行一些的程序檢查肛冶。
例如,.sas和.log的末次修改時(shí)間扯键,兩者比較可以判斷出睦袖,程序更新后,是否重新Run過(guò)荣刑;例如馅笙,Source側(cè) (Production)的.log文件與QC側(cè) (Validation)的.log的末次修改時(shí)間,判斷V側(cè)程序是否在P側(cè)程序之后Run過(guò)厉亏。
2. 涉及內(nèi)容
前面兩篇文章介紹了董习,通過(guò)SAS編程,如何獲取某路徑下的所有文件名稱爱只,以及如何如何獲取某個(gè)文件的末次修改時(shí)間:
這篇文章是兩者內(nèi)容的結(jié)合恬试,先使用Dopen
系列函數(shù)獲取所有文件的名稱(文件路徑)窝趣,再使用Fopen
系列函數(shù)獲取所有文件的修改時(shí)間。
文章中所涉及具體函數(shù)介紹训柴,參考以下兩篇文章:
我使用以下路徑文件進(jìn)行演示哑舒,路徑中有4個(gè).sas
文件、4個(gè).log
文件幻馁,以及1個(gè)文件夾洗鸵,共9個(gè)文件。
3. 獲取所有文件的名稱(文件路徑)
使用Dopen
函數(shù)打開指定路徑宣赔,在當(dāng)前SAS會(huì)話中预麸,獲取路徑ID;使用Dnum
函數(shù)獲取該路徑內(nèi)的文件數(shù)目儒将;使用Do
語(yǔ)句循環(huán)以及Dread
函數(shù)吏祸,獲取路徑下每一個(gè)文件的名稱。
獲取名稱后钩蚊,將文件夾路徑與文件名稱拼接贡翘,就獲取到文件的對(duì)應(yīng)路徑。
**Dopen;
%let dirpath = E:\99_Test\Test\test1;
data _tmp1;
fileres=filename("dirpath","&dirpath.");
dirid=dopen("dirpath");
num = dnum(dirid);
length direct filename filepath $200;
if dirid > 0 and num > 0 then do;
do i = 1 to num;
direct = "&dirpath.";
filename = dread(dirid, i);
filepath = catx("\", direct,filename);
output;
end;
end;
keep direct filename filepath;
run;
運(yùn)行結(jié)果如下:
4. 獲取所有文件的修改時(shí)間
使用Fopen
函數(shù)打開文件路徑砰逻,在當(dāng)前SAS會(huì)話中鸣驱,獲取文件ID;使用Finfo
函數(shù)獲取文件的修改時(shí)間蝠咆。
不同SAS語(yǔ)言環(huán)境下踊东,文件的屬性名稱不同北滥。以末次修改時(shí)間為例:中文環(huán)境,“上次修改時(shí)間”闸翅;英文環(huán)境再芋,“Last Modified”。
中文環(huán)境:
**Fopen -- Chinese;
data _tmp2;
set _tmp1;
*Get fileID;
fileres = filename("filepath", filepath);
fileid = fopen("filepath");
*Get Last Modified date;
if fileid > 0 then do;
length Last_modified $200;
Last_modified = finfo(fileid, "上次修改時(shí)間");
end;
*Close fileID;
fileid_c = fclose(fileid);
run;
結(jié)果如下:
英文環(huán)境:
**Fopen -- English;
data _tmp2;
set _tmp1;
*Get fileID;
fileres = filename("filepath", filepath);
fileid = fopen("filepath");
*Get Last Modified date;
if fileid > 0 then do;
length Last_modified $200;
Last_modified = finfo(fileid, "Last Modified");
end;
*Close fileID;
fileid_c = fclose(fileid);
run;
最后使用fclose
函數(shù)注銷當(dāng)前SAS會(huì)話中文件ID的這一操作坚冀,在日常工作中比較常用济赎,也是一個(gè)比較好的編程習(xí)慣。
例如记某,對(duì)于不需要輸出到SAS Results頁(yè)面的程序結(jié)果司训,可以在其前后添加:ods results off;
, ods results on
,即關(guān)閉后再打開液南。
例如壳猜,在日志中輸出某個(gè)宏程序的運(yùn)行代碼,可以在其前后添加:options mprint;
, options nomprint;
, 即打開后再關(guān)閉滑凉。
讀者可以自行測(cè)試下蓖谢,上面代碼去掉fclose
函數(shù)處理后是什么輸出結(jié)果。
總結(jié)
對(duì)于第4步譬涡,我嘗試了好幾種方法闪幽,當(dāng)前處理是最簡(jiǎn)潔的。
之前文章SAS宏程序:批量獲取文件的修改時(shí)間介紹了涡匀,SAS如何通過(guò)調(diào)用本機(jī)電腦CMD語(yǔ)句的返回結(jié)果盯腌,批量獲取文件的修改時(shí)間。但在公司服務(wù)器系統(tǒng)測(cè)試發(fā)現(xiàn)陨瘩,SAS無(wú)法訪問(wèn)CMD結(jié)果腕够,我沒(méi)去深究具體原因瞎颗。
Python環(huán)境下蹈胡,實(shí)現(xiàn)這一功能也不復(fù)雜萤悴,但要考慮是否允許在公司系統(tǒng)內(nèi)進(jìn)行隶垮,需要跟IT溝通。
感謝閱讀淤年, 歡迎關(guān)注十厢!
若有疑問(wèn)避乏,歡迎評(píng)論交流贯卦!