檔案處理

Download Report

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, '位置對時間的變化');