2012年2月6日 星期一

Perl的檔案處理

Perl的檔案處理

很多朋友一定有這樣的經驗,當需要剪貼大量資料的時候,

Ctrl+C (複製) 以及 Ctrl+V (貼上) 一筆一筆剪貼,

很費時,但又想不到別的方法,

別懷疑,一有重複的動作,直覺就是用程式幫忙吧!


首先,先簡單講一下檔案存取,

在perl裡,我們要讓作業系統知道,要對哪個檔案進行處理,

需要使用到的就是檔案代號 (FileHandle)

檔案代號是由使用者自行命名,並且用來跟實體檔案進行連結的名稱,

一般來說,我們習慣用全部大寫來作為檔案代號。


現在很多資料都以Excel檔為主,阿逸處理資料上,

習慣上是先另存新檔成.txt(純文字檔)再做處理,


而檔案轉成.txt後,每個欄位都會以Tab分隔,如下圖:


接著再用程式來進行操作。(範例檔案: 點我下載)


用perl進行開檔、關檔也很直覺,只要這麼一行就可以:

open FILE, "File_sample_1.txt"; # FILE 即是使用者自行定義的檔案代號

不過阿逸習慣加上大於(>)、小於(<)符號,表示方向

有方向性的觀念會幫助你很容易記清楚檔案,

所以上面的式子可以多加入小於(<)符號,

open FILE, "; # FILE 即是使用者自行定義的檔案代號

表示我要讀取檔案。反之:

open FILE, ">File_sample_2.txt"; # FILE 即是使用者自行定義的檔案代號

則表示我要寫入檔案注意:每次執行都會把原有檔案覆蓋。

如果希望不覆蓋檔案,而想把資料繼續寫進去,就要使用遠大於(>>)符號

open FILE, ">>File_sample_2.txt"; # FILE 即是使用者自行定義的檔案代號

如此一來資料就會繼續加在檔案的結尾。


用幾個例子來試試看吧!首先是寫入檔案:

open FILE, ">File_sample_2.txt"; # FILE 即是使用者自行定義的檔案代號

{

print FILE "Hello World!";# 表示我要印出字串到FILE所對照的檔案內

}

執行後,可以看到同路徑下,產生了一個檔案 File_sample_2.txt

點開File_sample_2.txt後,剛剛打的Hello World! 就在裡面。

同樣要記住:每次執行都會把原有檔案覆蓋。

再來試試看這個吧!

open FILE, ">>File_sample_2.txt"; # FILE 即是使用者自行定義的檔案代號

{

print FILE "Hello World!";# 表示我要印出字串到FILE所對照的檔案內

}

多執行個幾次,你會看到檔案裡面,Hello World! 多了好幾行!

最後講檔案讀取吧!

讀取檔案這部分我們多著墨來討論,

為了解說方便,請下載剛剛的範例檔案。


下載好後,把範例跟你的練習程式放在同個資料夾下。

while開檔時,檔案內容會一行一行讀取,

只有讀取資料不夠,在這裡,我們要加上一點變化!

即是把資料再作進一步的處理:

openFILE,"<File_sample_1.txt";

while($line=<FILE>)

{

# 檔案是一次讀一行進來

chomp $line; #把換行符號拿掉

@split = split ("\t",$line); #每一行以Tab字元分割 存入陣列

foreach (@split) # 對每一個陣列

{

if ($_ =~ /\D/) # 如果陣列裡面是 非數字 (\D)

{

push @array, $_; # 則放入新的陣列

}

}

}

print $array[0]; # 印出第一個處理後的陣列

執行結果會看到,保留在陣列第一個元素的即是 I

最後,把整個鎮列印出來試試看吧!

看數字是不是都消失了!

print @array; # 把每個陣列印出來


熟悉Perl的檔案處理之後,接下來就要介紹,

Perl的模組實際應用

沒有留言:

張貼留言