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的模組實際應用。