Transcript 檔案處理
MATLAB 程式設計入門篇 檔案處理 修改自張智星教授講義 [email protected] http://www.cs.nthu.edu.tw/~jang 清大資工系 多媒體資訊檢索實驗室 MATLAB 程式設計入門篇:讀寫檔案 本章重點 MATLAB 內建許多有關檔案處理的函數,可 處理各式各樣的檔案 基本功能 文字、影像、聲音、...... 開啟、讀取、寫入、關閉 本節將介紹純文字與excel檔的處理 MATLAB 程式設計入門篇:讀寫檔案 開啟檔案 無論讀寫純文字或二進制檔案,都必需先用 fopen 函數來開啟檔案 fid = fopen(filename, permission) filename:讀寫的檔案名稱 permission :對檔案的處理方式,可以是下列任一字串: 'r':只准讀取(reading)檔案 'w':只准寫入(writing)檔案 'a':只准加入(appending)檔案 'a+':可讀取及加入檔案(reading and appending) fid:檔案指標 MATLAB 程式設計入門篇:讀寫檔案 開啟檔案 若開啟成功,則傳回的 fid 是一個大於 2 的整數,而且傳回 的 message 是一個空字串 0: 標準輸入(鍵盤) 1: 標準輸出(螢幕) 2: 標準錯誤(也是螢幕,但代表有錯誤發生) 範例: [fid, message] = fopen('help.m', 'r'); fprintf('fid = %d\n', fid); fprintf('message = %s\n', message); fclose(fid); 輸出: fid = 3 message = MATLAB 程式設計入門篇:讀寫檔案 開啟檔案 若檔案開啟失敗,則fid為-1: [fid, message] = fopen('no_such_file.txt', 'r'); fprintf('fid = %d\n', fid); fprintf('message = %s\n', message); 輸出: fid = -1 message = No such file or directory message 會包含相關的錯誤資訊。 MATLAB 程式設計入門篇:讀寫檔案 關閉檔案 完成檔案的讀寫之後,可用 fclose 函數來關閉檔案,用法如下: status = fclose(fid); 若一切順利,fclose 傳回 0 若無法順利關閉檔案,則 fclose 傳回 -1 若要一次關閉所有開啟的檔案,可用 fclose('all') 或是 fclose all 為避免因開啟檔案過多而造成系統資源浪費,一般在完成檔案 的讀寫後,即應使用 fclose 來關閉檔案 開啟及關閉檔案都是比較耗時的函數,因此盡量不要將他們置 於迴圈之中,以提高程式執行效率 MATLAB 程式設計入門篇:讀寫檔案 基本檔案讀取 fileread:將一個檔案的內容送到一個字串 範例: out = fileread('help.m'); fprintf('%s\n',out); 執行上述範例後,MATLAB 會… 先在目前目錄找尋 help.m 若找不到,再根據搜尋路徑,找出 help.m 指令 找到後,將其內容塞進out變數,再顯示出來。 MATLAB 程式設計入門篇:讀寫檔案 讀取純文字檔案 fgetl 函數: 可將純文字檔案的內容中的某一列讀出 不包含換行字元(另有一fgets函數,會保留換行字元) 範例: fin = fopen('mean.m', 'r'); % 習慣上,用於讀取的檔案指標,會命名為fin,取自file in while (~feof(fin)) % feof: 測試檔案是否已讀完 line = fgetl(fin); fprintf('%s\n', line); end fclose(fin); MATLAB 程式設計入門篇:讀寫檔案 讀取純文字檔案 fscanf:可對純文字檔案作更精確的讀取,用 法如下: matrix = fscanf(fid, format, size) fid:欲讀取之檔案的指標 format:格式指定字串,用法與fprintf相同 size:讀進來的大小 MATLAB 程式設計入門篇:讀寫檔案 讀取純文字檔案 有一文字檔 test.txt 如下: 123 149 使用fscanf指令讀取內容: fin = fopen('test.txt', 'r'); myData = fscanf(fin, '%d', [3 2]); fclose(fin); 得到的myData矩陣內容: 1 1 2 4 3 9 MATLAB 程式設計入門篇:讀寫檔案 讀取純文字檔案 有一文字檔 test.txt 如下: 1 4 9 16 25 36 49 64 81 100 使用fscanf指令讀取內容: fin = fopen('test.txt', 'r'); myData = fscanf(fin, '%d', [3 4]); fclose(fin); 得到的myData矩陣內容: 1 16 49 100 4 25 64 0 9 36 81 0 MATLAB 程式設計入門篇:讀寫檔案 讀取純文字檔案 對於格式已知的檔案,可用textread指令一次讀取 [a, b, c, ...] = textread(檔名, 格式) 有一文字檔mydata.txt如下: Sally Type1 12.34 45 Yes Joe Type2 23.54 60 No Bill Type1 34.90 12 No 使用以下指令讀取 [names, types, x, y, answer] = textread('mydata.txt','%s%s%f%d%s'); MATLAB 程式設計入門篇:讀寫檔案 寫入純文字檔案 fprintf(fid, format, y) fid:是欲寫入之檔案的指標 format 是格式指定字串,用以指定資料寫至檔案的格式 y 是 MATLAB 的資料變數 除了多出"fid"以外,皆與「格式化輸出」時教過的 一樣 MATLAB 程式設計入門篇:讀寫檔案 寫入純文字檔案 範例: fout = fopen('test.txt', 'w'); fprintf(1, '123\n'); % 螢幕 fprintf(2, '123\n'); % 螢幕(紅字) fprintf( '123\n'); % 螢幕 fprintf(fout,'123\n'); % 檔案 fclose(fout); 輸出(檔案): 123 輸出(螢幕): 123 123 123 MATLAB 程式設計入門篇:讀寫檔案 寫入純文字檔案 範例:將平方根表寫入檔案 x = 1:10; y = [x; sqrt(x)]; fout = fopen('sqrtTable.txt', 'w'); fprintf(fout , 'Table of square root:\r\n'); fprintf(fout , '%2.0f => %10.6f\r\n', y); % 會對每組數目自動重複印出 fclose(fout); MATLAB 程式設計入門篇:讀寫檔案 指令彙整 開檔/關檔 fopen: 開啟檔案 fclose: 關閉檔案 讀檔/寫檔 fscanf: 從檔案讀取格式化資料 fprintf: 將格式化資料寫入檔案 fgetl: 從檔案讀取一列資料,但捨去換行字元 fgets: 從檔案讀取一列資料,但保留換行字元 textread: 對付格式固定的檔案 其他 feof: 是否已讀至檔案結尾 MATLAB 程式設計入門篇:讀寫檔案 讀取excel檔案 [numeric, txt, raw] = xlsread(file, sheet, range) file: 檔名(必要參數) sheet: 第幾張表(如:1),或表的名稱(如:'Sheet1') range: 讀取範圍 numeric: 數字資料(非數字會變成NaN) txt: 文字資料 raw: 混合型態,讀取成未處理的cell array 範例: [num txt raw] = xlsread('fileExample.xls', 1, 'a1:c25'); MATLAB 程式設計入門篇:讀寫檔案 讀取excel檔案 讀取進來以後,可以做進一步的處理: [num txt raw] = xlsread('fileExample.xls', 1, 'a1:c25'); mat = num(5:23,1:3); plot(mat(:,1),mat(:,2),'o-', mat(:,1),mat(:,3),'x-'); legend('A','B'); xlabel('時間(分鐘)'); ylabel('攝氏溫度'); grid on; MATLAB 程式設計入門篇:讀寫檔案 寫入excel檔案 [status msg] = xlswrite(file, array, sheet, range); 範例:寫入魔方陣 xlswrite('test1.xlsx', magic(5)); 範例:寫入自由落體資料 data={'時間 (sec)', '位置 (m)'}; for t=1:5 data{t+1,1} = t; data{t+1,2} = 0.5*9.8*t^2; end [status, message] = xlswrite('test2.xlsx', data, '位置對時間的變化');