工作中有時(shí)需要將外部文本信息導(dǎo)入SAS數(shù)據(jù)集中進(jìn)行處理坯墨,例如,將.log文檔導(dǎo)入SAS數(shù)據(jù)集進(jìn)行判斷輸出相關(guān)issue病往。這篇文章捣染,介紹2種SAS讀入外部文檔數(shù)據(jù)的方法。
第一種方法停巷,通過(guò)Fopen
系列函數(shù)讀入耍攘;第二種方法,通過(guò)infile
語(yǔ)句讀入畔勤。兩者相比蕾各,后者的代碼相對(duì)簡(jiǎn)潔,建議使用后者庆揪。
以以下路徑內(nèi)容進(jìn)行演示:
1. Fopen
系列函數(shù)
在之前文章中介紹過(guò)式曲,通過(guò)Fopen
系列函數(shù)獲取文件的末次修改時(shí)間的應(yīng)用,例如嚷硫,SAS編程-宏:Source側(cè)與QC側(cè)程序運(yùn)行時(shí)間檢查检访。
關(guān)于讀入外部數(shù)據(jù),主要用到Fread
仔掸、Fget
這兩個(gè)函數(shù)脆贵。
Fread
函數(shù)的作用是,從外部文件中讀入一條記錄到文件數(shù)據(jù)緩沖區(qū)(Reads a record from an external file into the FileData Buffer (FDB))起暮。成功讀入一條記錄卖氨,函數(shù)返回0值;讀入失敗负懦, 函數(shù)返回非0值筒捺。一個(gè)Fread函語(yǔ)句只能讀入一條記錄,如果想要讀取外部文檔的所有記錄纸厉,需要通過(guò)循環(huán)進(jìn)行處理系吭。
Fget
函數(shù)作用是,將數(shù)據(jù)從文件數(shù)據(jù)緩沖區(qū)(FDB)復(fù)制到一個(gè)變量中(Copies data from the File Data Buffer (FDB) into a variable)颗品。成功復(fù)制肯尺,函數(shù)返回0值沃缘;如果沒(méi)有內(nèi)容復(fù)制,函數(shù)返回-1则吟。
在介紹Fread
函數(shù)的SAS官方文檔的中槐臀,就有利用這兩個(gè)函數(shù)讀入外部文檔的程序舉例。只不過(guò)示例使用的是宏程序氓仲,并將文檔內(nèi)容輸出到SAS日志中水慨。(來(lái)源:SAS Help Center: FREAD Function)
為方便對(duì)文檔信息的處理,需將文檔內(nèi)容讀入SAS 數(shù)據(jù)集敬扛。以上程序不難在Data 步中實(shí)現(xiàn)晰洒。
%let filepath = E:\99_Test\Test\test5\Check_date.log;
data tmp;
*Get fileID;
fileres = filename("filepath", "&filepath.");
fileid = fopen("filepath");
length text $200;
do while ( fread(fileid) = 0 );
getres = fget(fileid, text, 200);
output;
end;
run;
以上程序并沒(méi)有使用Fclose
函數(shù)注銷(xiāo)“文件ID”,也沒(méi)有使用filename
函數(shù)取消取消文件路徑的關(guān)聯(lián)舔哪。這樣操作對(duì)輸出結(jié)果沒(méi)有影響欢顷,因?yàn)槌绦蜻\(yùn)行結(jié)束后,關(guān)聯(lián)會(huì)自動(dòng)移除捉蚤、釋放。
其實(shí)炼七,以上代碼也無(wú)法使用這兩個(gè)函數(shù)缆巧,因?yàn)檫@兩個(gè)函數(shù)在Data步驟只能以賦值語(yǔ)句的形式存在。由于Do while代碼塊中有Output語(yǔ)句豌拙,循環(huán)結(jié)束后賦值語(yǔ)句是失效的陕悬,所以無(wú)法實(shí)現(xiàn)。.
不過(guò)按傅,如果通過(guò)Do Until
語(yǔ)句實(shí)現(xiàn)循環(huán)捉超,則可以在循環(huán)內(nèi)部進(jìn)行處理“釋放”相關(guān)內(nèi)容。最后一次循環(huán)記錄不會(huì)讀入外部文檔記錄唯绍,可以直接刪除拼岳。
%let filepath = E:\99_Test\Test\test5\Check_date.log;
data tmp;
*Get fileID;
fileres = filename("filepath", "&filepath.");
fileid = fopen("filepath");
*Read records;
length text $200;
readres = 0;
do until ( readres ne 0 );
getres = fget(fileid, text, 200);
readres = fread(fileid);
if readres ne 0 then do;
clores = fclose(fileid);
defile = filename("filepath", " ");
delete;
end;
output;
end;
run;
輸出結(jié)果如下:
2. infile
語(yǔ)句
infile
語(yǔ)句的作用是,指定要用INPUT語(yǔ)句讀入的外部文件(Specifies an external file to read with an INPUT statement)况芒。
infile
語(yǔ)句不像Fread系列函數(shù)那樣需要2步讀入惜纸,可以直接讀入外部文檔,簡(jiǎn)潔高效許多绝骚。
示例代碼如下:
%let filepath = E:\99_Test\Test\test5\Check_date.log;
data tmp2;
filepath = "&.filepath.";
infile dummy filevar = filepath end = lastrec truncover;
do while(not lastrec);
input text $200;
output;
end;
run;
filevar =
選項(xiàng)指定保存外部文檔地址的變量耐版,變量可以包含多個(gè)文件地址,input
語(yǔ)句會(huì)一次進(jìn)行讀入压汪。
如果讀入的記錄不足input
語(yǔ)句設(shè)定的長(zhǎng)度時(shí)粪牲,infile語(yǔ)句會(huì)默認(rèn)接著讀取下一條記錄。truncover
選項(xiàng)使得讀入記錄長(zhǎng)度小于input
語(yǔ)句設(shè)定長(zhǎng)度時(shí)止剖,會(huì)另開(kāi)一行讀取下一條記錄腺阳。
就不詳細(xì)介紹其他選項(xiàng)的含義了落君,具體參考SAS官方文檔SAS Help Center: INFILE Statement。
讀入結(jié)果如下舌狗,與前面結(jié)果一致叽奥。
總結(jié)
文章介紹了2種讀入外部文檔的方法,推薦使用infile
語(yǔ)句痛侍,簡(jiǎn)潔高效朝氓。
感謝閱讀, 歡迎關(guān)注主届!
若有疑問(wèn)赵哲,歡迎評(píng)論交流!