SAS編程:如何讀入外部文檔數(shù)據(jù)丰捷?

工作中有時(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)行演示:

Filepath

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

Fread

為方便對(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é)果如下:

Result 1

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é)果一致叽奥。

Result 2

總結(jié)

文章介紹了2種讀入外部文檔的方法,推薦使用infile語(yǔ)句痛侍,簡(jiǎn)潔高效朝氓。

感謝閱讀, 歡迎關(guān)注主届!
若有疑問(wèn)赵哲,歡迎評(píng)論交流!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末君丁,一起剝皮案震驚了整個(gè)濱河市枫夺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绘闷,老刑警劉巖橡庞,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異印蔗,居然都是意外死亡扒最,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)华嘹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吧趣,“玉大人,你說(shuō)我怎么就攤上這事耙厚∏看欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵薛躬,是天一觀的道長(zhǎng)俯渤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)泛豪,這世上最難降的妖魔是什么稠诲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮诡曙,結(jié)果婚禮上臀叙,老公的妹妹穿的比我還像新娘。我一直安慰自己价卤,他們只是感情好劝萤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著慎璧,像睡著了一般床嫌。 火紅的嫁衣襯著肌膚如雪跨释。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天厌处,我揣著相機(jī)與錄音鳖谈,去河邊找鬼。 笑死阔涉,一個(gè)胖子當(dāng)著我的面吹牛缆娃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瑰排,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贯要,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了椭住?” 一聲冷哼從身側(cè)響起崇渗,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎京郑,沒(méi)想到半個(gè)月后宅广,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡些举,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年乘碑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片金拒。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖套腹,靈堂內(nèi)的尸體忽然破棺而出绪抛,到底是詐尸還是另有隱情,我是刑警寧澤电禀,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布幢码,位于F島的核電站,受9級(jí)特大地震影響尖飞,放射性物質(zhì)發(fā)生泄漏症副。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一政基、第九天 我趴在偏房一處隱蔽的房頂上張望贞铣。 院中可真熱鬧,春花似錦沮明、人聲如沸辕坝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酱畅。三九已至琳袄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纺酸,已是汗流浹背窖逗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留餐蔬,地道東北人碎紊。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像用含,于是被迫代替她去往敵國(guó)和親矮慕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容