matlab讀文件


用實例介紹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);

【秘籍】

  1. 讀取數據時,根據不同的數據格式選擇最合適的函數;
  2. 寫數據比較自由,萬能的方法就用 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

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM