18-1 高階的檔案讀寫

MATLAB 有許多現成的指令,可以支援各種常見檔案格式的讀寫,我們將較重要的檔案格式及相關讀取(或寫入)指令整理如下(以 MATLAB 8.5 為主):

類別支援檔案格式指令
一般資料 MAT - MATLAB workspaceload, save
CSV - Comma separated numbers csvread, csvwrite
DAT - Formatted text importdata
DLM - Delimited text dlmread, dlmwrite
TAB - Tab separated text
試算表 XLS - Excel worksheet xlsread
科學資料 CDF - Common Data Format cdfread, cdfwrite
FITS - Flexible Image Transport System fitsread
HDF - Hierarchical Data Format hdfread, hdfwrite
電影 AVI, MPG, WMV, ASF, ASX, MP4, M4V, MOV, etc.videoreader
影像 TIFF, PNG, HDF, BMP, JPEG, GIF, PCX, XWD, CUR, ICO, RAS, PBM, PGM, PPM, etc. imread, imwrite
音訊 WAV, OGG, FLAC, AU, MP#, M4a, MP4, AU, SND, etc. audioread, audiowrite

以下將針對幾個常用的指令來說明。

如果一個資料檔案是由逗號分開,而且只有包含數值資料,則可以使用 csvread 指令來讀取此檔案,例如:

Example 1: 18-檔案讀寫/csvread01.mfprintf('data.csv 的內容:\n'); type data.csv % 列出 data.csv 的內容 A = csvread('data.csv') % 將 data.csv 的內容讀到矩陣 Adata.csv 的內容: 1, 2, 3 4, 5 6, 7, 8, 9 A = 1 2 3 0 4 5 0 0 6 7 8 9

由上述範例可知,csvread 會傳回一個數值矩陣,並將缺席的資料以 0 填入。

如果數值資料的分界符號(Delimiters)不是逗點,就不能使用 csvread 指令,而要改用 dlmread 指令,例如:

Example 2: 18-檔案讀寫/dlmread01.mfprintf('data.dlm 的內容:\n'); type data.dlm % 列出 data.dlm 的內容 A = dlmread('data.dlm', '\t') % 將 data.dlm 的內容讀到矩陣 Adata.dlm 的內容: 1 2 3 4 5 6 7 8 9 A = 1 2 3 0 4 5 0 0 6 7 8 9

在上述範例中,data.dlm 的資料是以定位鍵(Tab)隔開,因此 dlmread 指令的第二個引數是 ‘\t’,以代表定位鍵。

如果檔案資料包含數值及字串,我們就必須改用 textread 指令,例如:

Example 3: 18-檔案讀寫/textread01.mfprintf('data.txt 的內容:\n'); type data.txt % 列出 data.txt 的內容 [name, hobby, age] = textread('data.txt', '%s%s%d')data.txt 的內容: Timmy OnlineGames 13 Annie Chatrooms 10 Roger Tennis 41 name = 'Timmy' 'Annie' 'Roger' hobby = 'OnlineGames' 'Chatrooms' 'Tennis' age = 13 10 41

在上述範例中,data.txt 包含三個欄位(或是三直行的資料),textread 可以在第二個引數指定資料型態(例如 %s 代表字串,%d 代表整數),並將讀入的資料設定到不同的輸出引數,由於資料型態的不同,輸出引數也有不同的型態,以上述範例來說,name 和 hobby 都是字串異值陣列,而 age 則是數值陣列。

在上例中,我們是利用空格來分隔欄位,如果欄位值本身也有空格,我們就可以考慮使用定位鍵來分隔欄位。例如:

Example 4: 18-檔案讀寫/textread02.mfprintf('data2.txt 的內容:\n'); type data2.txt % 列出 data2.txt 的內容 [name, hobby, age] = textread('data2.txt', '%s%s%d', 'delimiter', '\t')data2.txt 的內容: Timmy Online Games 13 Annie Chatrooms 10 Roger Table Tennis 41 name = 'Timmy' 'Annie' 'Roger' hobby = 'Online Games' 'Chatrooms' 'Table Tennis' age = 13 10 41

在上述範例中,我們只要在 textread 指令中再加上對於分界字元(Delimiters)的定義,就可以正確地讀出來由定位鍵所分隔的資料檔案。

使用 textread 指令,我們也可以讀取一個文字檔,同時把檔案內的每一列文字變成字串異質陣列裡面的每一個元素,例如:

Example 5: 18-檔案讀寫/textread03.mcontents = textread('textread03.m','%s','delimiter','\n','whitespace',''); class(contents) % 印出 contents 的資料類別 contents{1} % 列出 contents 第一列 contents{2} % 列出 contents 第二列 ans = cell ans = contents = textread('textread03.m','%s','delimiter','\n','whitespace',''); ans = class(contents) % 印出 contents 的資料類別

在上述範例中,我們使用 textread 指令來讀 textread03.m(也就是此範例檔案),並顯示此檔案的第一列和第二列。

事實上,textread 指令的用法很多,功能也很強大,讀者可以輸入「help textread」就可以得到完整的技術支援。

如果只是要將一個檔案的內容送到一個字串,可以使用 fileread 指令,範例如下:

Example 6: 18-檔案讀寫/fileread01.mout = fileread('data2.txt'); class(out) size(out) ans = char ans = 1 64

在上述範例中,fileread 指令會將檔案 data2.txt 的內容送到字串變數 out,class(out) 的值是 char, 顯示 out 的資料型態是字串,size(out) 則顯示字串 out 的長度是 64。

有關於影像檔案的讀寫,讀者可以參考本書第十九章「影像顯示與讀寫」;有關音訊檔案的讀寫,讀者可以參考本書第二十章「音訊讀寫、錄製與播放」。

如果你的資料檔案符合本小節所說明的格式,那就盡量採取本小節所介紹的指令來進行讀寫。但是如果你的資料格式比較繁複,那就需要一列一列讀進來,再進行剖析(Parsing),相關指令將在下列各小節介紹。


MATLAB程式設計:入門篇