我想獲取特定路徑下文件的末次修改時間莹捡,例如鬼吵,.sas
和.log
的末次修改時間,兩者比較判斷程序更新后篮赢,是否重新Run過齿椅;例如,Source側(cè) (Production)的.log
文件與QC側(cè) (Validation)的.log
的末次修改時間启泣,判斷V側(cè)程序是否在P側(cè)程序之后Run過涣脚。
利用Dopen系列以及Fopen系列函數(shù),可以實現(xiàn)上述功能寥茫。
為了方便讀者更好的理解遣蚀,我先介紹這兩個系列中的一些函數(shù)。這篇文章介紹Dopen系列函數(shù)纱耻,涉及的函數(shù)如下:
- DOPEN
- DCLOSE
- DNUM
- DREAD
- DOPTNAME
- DINFO
我使用以下路徑文件進行演示芭梯,路徑中有4個.sas
文件、4個.log
文件弄喘,以及1個文件夾玖喘,共9個文件。
1. DOPEN(fileref)
DOPEN函數(shù)的作用是蘑志,打開一個路徑累奈,并返回一個路徑標識值 (Opens a directory, and returns a directory identifier value)。
這可以理解為急但,在一次SAS會話中澎媒,給路徑發(fā)放身份證明,這個證明與路徑是一一對應的波桩,就像人的身份證一樣戒努。人有了身份證,可以進行諸如乘高鐵镐躲、坐飛機的活動柏卤;在SAS會話中,路徑有了“身份證”匀油,也可以進行一些“特定活動”。
DEOPEN函數(shù)的參數(shù)值是一個文件引用(fileref)勾笆,這個文件引用必須在調(diào)用函數(shù)前與特定的路徑進行關聯(lián)敌蚜,常用的文件關聯(lián)方式有兩種:
第1種,全局filename
語句:
filename dirpath "E:\99_Test\Test\test1";
第2種窝爪,filename
函數(shù):
data test;
fileres = filename("dirpath", "E:\99_Test\Test\test1");
run;
如果關聯(lián)成功弛车,filename函數(shù)會返回0齐媒;如果關聯(lián)失敗,filename函數(shù)會返回非0值纷跛。
文件引用關聯(lián)成功后喻括,就可以使用DOPEN函數(shù)打開,函數(shù)在該SAS會話中贫奠,返回路徑對應的“身份證號”唬血。
**dopen;
%let dirpath = E:\99_Test\Test\test1;
data tmp;
fileres = filename("dirpath","&dirpath");
dirid = dopen("dirpath");
run;
Filename函數(shù)返回0值,說明文件引用關聯(lián)成功唤崭。Dopen函數(shù)返回的路徑“身份證號”的值為1拷恨。
其他信息可以參考SAS文檔:SAS Help Center: DOPEN Function。
2. DCLOSE(directory-id)
DCLOSE函數(shù)的作用是谢肾,關閉DOPEN函數(shù)打開的路徑(Closes a directory that was opened by the DOPEN function)腕侄。
DCLOSE函數(shù)的參數(shù)為,DOPEN返回的“身份證號”芦疏。DCLOSE函數(shù)可以類比冕杠,注銷身份證號。路徑的“身份證號”一旦被注銷酸茴,一些基于“身份證號”的活動就沒辦法進行分预。
**dclose;
%let dirpath = E:\99_Test\Test\test1;
data tmp;
fileres = filename("dirpath","&dirpath.");
dirid = dopen("dirpath");
dclose = dclose(dirid);
run;
“身份證號”注銷成功,返回0值弊决;注銷不成功噪舀,返回非0值。
其他信息可以參考SAS文檔:SAS Help Center: DCLOSE Function
3. DNUM(directory-id)
DNUM函數(shù)的作用是飘诗,返回路徑內(nèi)文件數(shù)量(Returns the number of members in a directory)与倡。
例如,演示路徑下有9個文件昆稿,DNUM函數(shù)對該路徑的“身份證號”進行處理纺座,返回值應該是9。
**dnum;
%let dirpath = E:\99_Test\Test\test1;
data tmp;
fileres = filename("dirpath","&dirpath.");
dirid = dopen("dirpath");
num = dnum(dirid);
run;
其他信息可以參考SAS文檔:SAS Help Center: DNUM Function
4. DREAD(directory-id, nval)
DREAD函數(shù)的作用是溉潭,讀取路徑下文件的名稱(Returns the name of a directory member)净响。
DREAD函數(shù)有2個參數(shù),一個是路徑的“身份證號”喳瓣,一個是路徑內(nèi)文件的位序馋贤,文件位序的排序為文件名的字符排序。
演示路徑下有9個文件畏陕,對應的配乓,也就是可以讀取到9個文件的名稱。
**dread;
%let dirpath = E:\99_Test\Test\test1;
data tmp;
fileres = filename("dirpath","&dirpath.");
dirid = dopen("dirpath.");
length direct filename filepath $200;
direct = "&dirpath";
ord = 1;
filename =dread(dirid, 1);
filepath = catx("\", direct, filename);
output;
ord = 2;
filename =dread(dirid, 2);
filepath = catx("\", direct, filename);
output;
……
ord = 9;
filename =dread(dirid, 9);
filepath = catx("\", direct, filename);
output;
run;
一一讀取文件比較繁瑣,由于DNUM函數(shù)可以獲取路徑內(nèi)文件數(shù)目犹芹,基于此可以使用Do
循環(huán)進行讀取文件名稱崎页,路徑名稱與文件名拼接可以獲得文件路徑。
**dread;
%let dirpath = E:\99_Test\Test\test1;
data tmp;
fileres = filename("dirpath","&dirpath.");
dirid = dopen("dirpath");
num = dnum(dirid);
length direct filename filepath $200;
direct = "&dirpath.";
if dirid > 0 then do;
do i = 1 to num;
filename = dread(driid, i);
filepath = catx("\", direct,filename);
ord = i;
output;
end;
end;
drop i;
run;
循環(huán)讀入結果與上面相同腰埂。
其他信息可以參考SAS文檔:SAS Help Center: DREAD Function飒焦。
5. DOPTNAME(directory-id, nval)
DOPTNAME函數(shù)的作用是,返回路徑的屬性名稱(Returns directory attribute information)屿笼。
DOPTNAME函數(shù)有2個參數(shù)牺荠,一個是路徑的“身份證號”,一個是路徑具體屬性的次序刁卜。在不同的電腦操作系統(tǒng)中志电,SAS讀取到的屬性是不同的。
在Windows操作系統(tǒng)中蛔趴,路徑屬性只有1個:
- Directory
在UNIX操作系統(tǒng)中挑辆,路徑屬性有5個:
- Directory
- Owner Name
- Group Name
- Access Permission
- Last Modified
不同的SAS系統(tǒng)語言,返回的結果也不同孝情。以Windows系統(tǒng)為例鱼蝉,舉例如下:
**doptname;
%let dirpath = E:\99_Test\Test\test1;
data tmp;
fileres=filename("dirpath","&dirpath.");
dirid=dopen("dirpath");
length info_it $200;
info_it = doptname(dirid, 1); output;
info_it = doptname(dirid, 2); output;
run;
不同的SAS系統(tǒng)語言,返回的屬性名稱也不同:
因為Windows系統(tǒng)中箫荡,DOPTNAME函數(shù)只能返回一個路徑屬性魁亦。當次序值取2時,函數(shù)返回值就為空羔挡,同時Log中也會輸出錯誤信息描述洁奈。
其他信息可以參考SAS文檔:SAS Help Center: DOPTNAME Function。
6. DINFO(directory-id, information-item)
DINFO函數(shù)的作用是绞灼,返回路徑屬性的具體信息(Returns information about a directory)利术。
DINFO函數(shù)有2個參數(shù),一個是路徑的“身份證號”低矮,一個是路徑的屬性名稱印叁,名稱因SAS系統(tǒng)語言的不同而不同。屬性名稱可以參考DOPTNAME函數(shù)的返回值军掂。
中文環(huán)境:
**dinfo-Chinese;
%let dirpath = E:\99_Test\Test\test1;
data tmp;
fileres=filename("dirpath","&dirpath.");
dirid=dopen("dirpath");
length attr $200;
attr= dinfo(dirid, "目錄");
run;
英文環(huán)境:
**dinfo-English;
%let dirpath = E:\99_Test\Test\test1;
data tmp;
fileres=filename("dirpath","&dirpath.");
dirid=dopen("dirpath");
length attr $200;
attr= dinfo(dirid, "Directory");
run;
在Windows環(huán)境下轮蜕,這個函數(shù)顯得很雞肋。只能讀取一個路徑的“路徑”信息蝗锥,有點脫褲子放屁的意味跃洛。。终议。
其他信息可以參考SAS文檔:SAS Help Center: DINFO Function税课。
相關閱讀:
SAS編程:如何獲取某路徑下文件的名稱闲延?
SAS編程:Fopen系列函數(shù)介紹
感謝閱讀, 歡迎關注韩玩!
若有疑問,歡迎評論交流陆馁!