用實例介紹Matlab讀寫文本文件的方法,包括load、dlmread、csvread、importdata、textscan、dlmwrite、csvwrite、save、fprintf函數的用法。
讀取文本方法
1. 純數據:數字、科學計數法
test.txt 文件內容如下:
1 2 3 4 5 6 1,2,3 4,5,6 1,2;3 1e+2 1.32e+1 2e+2 1e+2 1.32e+1 2e+2
推薦使用 load 函數,空格、逗號、分號隔開的均適用,要求數據列數一致。代碼如下,
data = load('test.txt');
鏈接:https://zhuanlan.zhihu.com/p/129803643
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
2. 包含頭信息
text.txt 文件內容如下:
head 1 head line 2 1e+2 1.32e+1 2e+2 1e+2 1.32e+1 2e+2 1e+2 1.32e+1 2e+2
使用 importdata、textscan 函數:
說明:importdata()函數和textscan()函數都可以從指定的某一行開始讀取數據。
% 從第3行開始讀取數據 content= importdata('test.txt', ' ', 2); data1 = content.data;
fid = fopen('test.txt', 'r'); % 從第3行開始讀,然后合並 % 如果是空格隔開的,一定不要添加分隔符 cData = textscan(fid, '%f %f %f', 'HeaderLines', 2, 'CollectOutput', 1); data2 = cData{1}; % 從元胞數組中提取數據 fclose(fid);
如果數據嚴格對齊,即分隔符完全一樣,如下都是一個空格分開:
head 1 head line 2 1e+2 1.32e+1 2e+2 1e+2 1.32e+1 2e+2 1e+2 1.32e+1 2e+2
還可以使用 dlmread 函數:
data2 = dlmread('test.txt', ' ', 2, 0);
如果數據嚴格對其,並用逗號分隔:
head 1 head line 2 1e+2, 1.32e+1, 2e+2 1e+2, 1.32e+1, 2e+2 1e+2, 1.32e+1, 2e+2
還可以使用 csvread 函數:
content= importdata('test.txt', ',', 2); data1 = content.data; fid = fopen('test.txt', 'r'); % 這里需要添加分隔符 cData = textscan(fid, '%f %f %f', 'HeaderLines', 2, 'Delimiter', ',', 'CollectOutput', 1); data2 = cData{1}; fclose(fid); data2 = dlmread('test.txt', ',', 2, 0); data3 = csvread('test.txt', 2, 0);
3. 文字和數字穿插
head 1 head line 2 1e+2, 1.32e+1, 2e+2 1e+2, 1.32e+1, 2e+2 1e+2, 1.32e+1, 2e+2 content 1 content 2 1 2 3 4 5 6 7 8
需要用到 textscan 函數,兩種思路:(1)指定從某行讀,需要打開文件兩次;(2)逐行讀取,數值部分連續讀取,推薦。
fid = fopen('test.txt', 'r'); cData = textscan(fid, '%f %f %f', 'HeaderLines', 2, 'Delimiter', ',', 'CollectOutput', 1); data1 = cData{1}; fclose(fid);
fid = fopen('test.txt', 'r'); cData = textscan(fid, '%f %f %f %f', 'HeaderLines', 7, 'CollectOutput', 1); data2 = cData{1}; fclose(fid);
fid = fopen('test.txt','r'); % 以只讀方式打開 line1 = fgets(fid); % 讀取文件的第1行 fgets()函數是讀取文件的一行。 line2 = fgets(fid); % 讀取文件的第2行 % 從第3行開始讀取數據,將讀取的相同數據類型的連續元胞連接成一個元胞數組 cData = textscan(fid, '%f %f %f', 'Delimiter', ',', 'CollectOutput', 1); data3 = cData{1}; line6 = fgets(fid); % 讀取文件的第6行 line7 = fgets(fid); % 讀取文件的第7行 cData = textscan(fid, '%f %f %f %f', 'Delimiter', ',', 'CollectOutput', 1); data4 = cData{1}; fclose(fid)
4. 數字不對齊
1 2 3
4 5
6
使用 dlmread 函數,缺少的部分會補零;
data = dlmread('test.txt');
5. 復數矩陣
1+1i, 1+2i
1+1i, 1+2i
使用 dlmread、textscan 函數:
data1 = dlmread('test.txt'); fid = fopen('test.txt', 'r'); A = textscan(fid, '%*f %*s %f %*s','delimiter', ' ', 'CollectOutput', 1); data2 = A{1}; fclose(fid);
6. 日期形式
2020-4-13, 10:10:10.111 AM
2020-4-13, 10:10:10.111 AM
2020-4-13, 10:10:10.111 AM
使用 textscan 函數:
fid = fopen('test.txt', 'r'); % 用'-,:'作分隔符 A = textscan(fid, '%d %d %d %d %d %f %s','delimiter','-,:','CollectOutput',1); fclose(fid);
寫文件方法
1. 寫數字
使用 save、dlmwrite、csvwrite函數:
% 保存數據、間隔tabs寬度、追加數據: a = 1000*rand(5); % 科學計數法形式 save('a.txt','a','-ascii'); save('a.txt','a','-ascii','-tabs'); save('a.txt','a','-append','-ascii','-tabs'); % 追加,空一行,分隔符,精度 dlmwrite('test.txt', a, '-append', 'roffset', 1, 'delimiter', '\t', 'precision', '%8.4f'); csvwrite('csvlist.csv', a); % 逗號隔開
2. 寫復數
使用 dlmwrite 函數:
x = [1+1i, 1+2i; 1+1i, 1+2i]; % 用逗號(',')作分隔符,用'\r\n'作換行符 dlmwrite('test.txt', x, 'delimiter', ',', 'newline', 'pc');
3. 帶有頭文件的文本
data = [1, 1, 1, 1; 2, 2, 2, 2]; fid=fopen('test.txt','wt'); fprintf(fid,'%s\n', 'head info'); % 頭信息 fprintf(fid,'%d %10.4f %10.4f %10.4f\n', data'); % 寫數據部分,注意轉置一下 fclose(fid); % 追加 line1 = [1 2 3 4]; line2 = [1 2 3]; line3 = [1 2]; fid = fopen('test.txt', 'at'); fprintf(fid, '%d %d %d %d\n', line1); fprintf(fid, '%d %d %d\n', line2); fprintf(fid, '%d %d\n', line3); fclose(fid);
【秘籍】
- 讀取數據時,根據不同的數據格式選擇最合適的函數;
- 寫數據比較自由,萬能的方法就用 fprintf 函數。
一.matlab讀取文件函數總結
1. load讀取方式
a.基本說明:
只能讀取數值數據,不能讀取含文本的數據;日期按數值讀取。
b.調用方式:
a=load(filename);
c. 有無分隔符限制:
無需輸入分隔符,可自動識別空格、逗號、分號、制表符。
d. 能否自定義讀取范圍:
不能。
e. 適用文件類型:
txt、csv。
2. importdata讀取方式
a.基本說明:
可讀取數值數據和含文本的數據,但是要求文本在數據的第一行或第一列。返回值分為數值部分(data)和文本部分(textdata)
b.調用方式:
a=importdata(filename,delm,nheaderlines);
filename:文件名(如果文件在其他路徑下,文件名前需加所在路徑。)
delm:分隔符
nheaderlines:從第nheaderlines+1行開始讀取數值數據。
c.有無分隔符限制:
多列數據時需輸入分隔符。若不輸入分隔符,整行會被作為字符串放入一列。
d.能否自定義讀取范圍:
可從某一行開始讀取數值數據。若使用importdata按鈕,則可自定義讀取范圍和設置數據類型。
f. 適用文件類型
txt、xls、xlsx、csv。
3. textscan讀取方式
a.基本說明:
可對列按照自定義格式讀取數據,必須輸入每列的讀取格式,可跳過某個列或幾列。按數值讀取時,缺少值以NaN填補;按字符讀取時,缺少值以空格填補。返回值按列放入元胞數組。
b.調用方式:
c =textscan(fid,‘format’,n,‘param’,value)
fid:文件指針。使用textscan函數時需先使用fopen函數打開數據文件,返回給fid文件。若不再使用,則需用 fclose(fid)關閉文件。
‘format’:定義每列的讀取格式。例如:%s表示按字符串讀取、%d表示按整數讀取、%D按日期讀取、%*表示跳過該列。level%u8表示將level1讀取成1,去掉level。
‘param’,value:這兩個參數成對出現。例如’Delimiter’,’s’表示按分隔符為’,’進行讀取。
c.有無分隔符限制
可自定義分隔符,不是必須的。
d.能否自定義讀取范圍:
可跳過某列或某幾列數據,但要保證跳過的列是可讀的,否則讀取也會出錯。
e.適用文件類型
txt、csv
4. textread讀取方式
a.基本說明:
適用於格式統一的txt文件的一次性大批量讀取。textread讀取某個文件后,下次再用,textread讀取這個文件時,還是會從文件頭開始讀取。
b.調用方式:
[A,B,C,…] =textread(filename,format)
[A,B,C,…] =textread(filename,format,N,’headerlines’,M)
Filename:文件名;
Format:就是要讀取的格式;
A,B,C…:從文件中讀取到的數據。中括號里面變量的個數必須和format中定義的個數相同。
N:表示讀取的次數,每次讀取一行。
Headerlines:表示從第M+1行開始讀入。
5. dlmread讀取方式
a. 基本說明:
只能讀取數值數據。如文件中含有文本,需使用range參數跳過。返回值為矩陣。
b. 調用方式:
result =dlmread(filename,delimiter,range);
filename:文件名。
delimiter:分隔符。
range:文件讀取范圍,格式為[R1 C1 R2 C2]。
c. 有無分隔符限制:
可自定義分隔符,不是必須的。
d. 能否自定義讀取范圍:
通過設置range,選擇讀取范圍。
e. 適用文件類型
txt、csv。
6. xlsread讀取方式
a. 基本說明:
讀取xls文件,可讀取含文本的數據,僅能返回數值部分。
b. 調用方式:
[num,txt,raw]=xlsread(file,sheet,range);
file:需要讀取的文件。
sheet:需要讀取的表單。
range:讀取范圍,格式為’A1:C4’。
num:返回的數值數據。
txt:返回的文本數據。
raw:返回未處理的數據。
c. 有無分隔符限制
無需輸入分隔符。
d. 能否自定義讀取范圍:
由sheet和range定義讀取范圍。
e. 文件適用范圍
xls、xlsx。
7. csvread讀取方式
a. 基本說明:
只能讀取逗號分隔的數值數據。如文件中含有文本,需使用range參數跳過。
b.調用方式:
m = csvread(‘filename’,r,c,rng);
filename:文件名字。
r,c:開始讀取的位置
rng:讀取范圍,格式為[R1 C1 R2 C2]
c.有無分隔符限制:
文件必須以逗號分隔。
d. 能否自定義讀取范圍:
可由r,c ,rng定義讀取范圍。
e. 文件適用范圍
txt、csv。
8. fread讀取方式
該函數讀取文件返回的是二進制矩陣。
二. matlab寫文件函數總結
1. xlswrite讀取方式
a.基本說明:
用matlab處理數據之后,需要將其保存到EXCEL內,而這必須用到xlswrite函數。
b.調用方式
A=xlswrite(filename, M); 將矩陣M的數據寫入名為filename的Excel文件中。
B=xlswrite(filename, M, sheet) ;將矩陣M的數據寫入文件名為filename中的指定的sheet中。
C=xlswrite(filename, M, range);將矩陣M中的數據寫入文件名為filename的Excel文件中,且由range制定存儲的區域,例如’C1:C2’.
D=xlswrite(filename, M, sheet, range)
**status = xlswrite(filename, …);**返回完成狀態值。
如果寫入成功,則status為1;反之,寫入失敗,則status為0.
2. dlmwrite讀取方式
a.基本說明:
將矩陣寫入ASCII分隔的文件。
b.調用方式
1)dlmwrite(filename, M)
使用默認的分隔符(’)將矩陣M寫入ASCII格式的文件中。在目標文件filname中,數據是從第一行的第一列開始寫的。輸入的filename是使用單引號括起來的字符串。
2)dlmwrite(filename, M, ‘D’)
將矩陣M寫入一個ASCII格式的文件中,使用分隔符D來分割矩陣的元素。在目標文件filname中,數據是從第一行的第一列開始寫的。逗號’是默認的分隔符,使用\t來產生制表符分割的文件。
3)dlmwrite(filename, M, ‘D’, R, C)
將矩陣M寫入一個ASCII格式的文件中,使用分隔符D來分割矩陣的元素。在目標文件filname中,數據是從第R行的第C列開始寫的,R和C從0開始,因此R=0,C=0指定了文件中的第一個數值,即左上角的位置。
4)dlmwrite(filename, M, ‘-append’)
將矩陣數據追加到文件的末尾。如果你不指定’’-append’,dlmwrite覆蓋文件中的任何現有數據。
5)dlmwrite(filename,M, ‘-append’, attribute-value list)
接受一個屬性值對列表。用戶可以將’-append’標志放在屬性-數值對之間,但不能放在屬性和它的值的中間。
————————————————
版權聲明:本文為CSDN博主「我是天才很好」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43593330/article/details/90485827