5ad14e5e609025e61270a2db236b5b5e.png

用实例介绍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');

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 函数:

% 从第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行
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];
% 用逗号(',')作分隔符,用'rn'作换行符
dlmwrite('test.txt', x, 'delimiter', ',', 'newline', 'pc');

3. 带有头文件的文本

data = [1, 1, 1, 1; 2, 2, 2, 2];
fid=fopen('test.txt','wt');
fprintf(fid,'%sn', 'head info'); % 头信息
fprintf(fid,'%d  %10.4f  %10.4f  %10.4fn', 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    %dn', line1);
fprintf(fid, '%d    %d    %dn', line2);
fprintf(fid, '%d    %dn', line3);
fclose(fid);

【秘籍】

  1. 读取数据时,根据不同的数据格式选择最合适的函数;
  2. 写数据比较自由,万能的方法就用 fprintf 函数。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐