介绍Matlab读写文本文件的方法,包括load、dlmread、csvread、importdata、textscan、dlmwrite、csvwrite、save等函数的用法。

读文件

  • 1. 纯数字

load test.txt % 导入文本数据,并保存在 test 变量;

x= load('test.txt') % 导入文本数据,并保存到x变量;
  • 2. 科学计数法数字

x = load('test.txt')

x = dlmread('test.txt')
  • 3. 符号隔开的数字

x= load('test.txt')     % 同一种符号隔开

x = dlmread('test.txt')    % 同一种符号隔开

x = csvread('test.txt')    % 多种符号隔开
  • 4. 包含头信息

x = importdata('test.txt')

        x.data % 查看读取的数值型数据

        x.textdata % 查看读取的文本数据

        返回结构体变量、分隔符、头文件行数:

[x, s, h] = importdata('examp02_07.txt');

        逗号作为分隔符,设置读取初始位置:

x = dlmread('test.txt', ',', 2, 0)

        空格作为分隔符,头文件信息 2 行 :

x = importdata('examp02_08.txt',' ',2)

 

  • 5. 文字数字文字数字混排

        

 

fid = fopen('test.txt','r');    % 以只读方式打开
line1 = fgets(fid);    % 读取文件的第1行
line2 = fgets(fid);    % 读取文件的第2行
% 从第3行开始读取数据,将读取的相同数据类型的连续元胞连接成一个元胞数组
A = textscan(fid, '%f %f %f', 'CollectOutput', 1)
line6 = fgets(fid);    % 读取文件的第6行
line7 = fgets(fid);    % 读取文件的第7行
B = textscan(fid, '%f %f %f', 'CollectOutput', 1)
fclose(fid);


fid = fopen('test.txt', 'r');
C_data = textscan(fid, '%f%f%f', 'HeaderLines', 2);  % 从第3行开始读
fclose(fid);

 

  • 6. 不整齐数字

x = dlmread('test.txt')  % 用 0 补齐
  • 7. 复数

        

x = dlmread('test.txt')

fid = fopen('test.txt', 'r');    
A = textscan(fid, '%f %*s %f %*s','delimiter',' ', 'CollectOutput', 1)
fclose(fid);  
  • 8. 日期

file_content= importdata('test.txt')    % 返回字符串元胞数组
file_content= char(file_content)    % 将字符串元胞数组转为字符矩阵
t = str2num(FileContent(:, 8:9))    % 提取字符矩阵的第8至9列,并转为数字

fid = fopen('test.txt', 'r');   
% 用'-,:'作分隔符
A = textscan(fid, '%d %d %d %d %d %f %*s','delimiter','-,:','CollectOutput',1)
fclose(fid);  
  • 9. 字符数字混排

fid = fopen('test.txt');
C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s')    % 以指定格式读取文件中数据
fclose(fid); 

fid = fopen('test.txt', 'r');  
A = textscan(fid, '%s %s %s %d %s %d %s %d %s', 'delimiter', ' ')
fclose(fid); 

fid = fopen('examp02_11.txt','r');  
A = textscan(fid, '%*s %*s %*s %d %*s %d %*s %d %*s', 'delimiter', ' ','CollectOutput', 1)
fclose(fid);

写文件

  • 1. 写复数

x = [1.455390 + 1.360686i, 8.692922 + 5.797046i; 3.509524 + 5.132495i, 4.018080 + 0.759667i];
% 用逗号(',')作分隔符,用'\r\n'作换行符
dlmwrite('test.txt', x, 'delimiter', ',', 'newline', 'pc')

x = 10*rand(2, 6);
fid = fopen('test.txt','wt');
fprintf(fid,'%f+%fi, %f+%fi\n', x);
fclose(fid);
  • 2. 写数字

x = 10000*rand(3, 2);  
fid = fopen('test.txt', 'wt');  
fprintf(fid,'%f    %f    %f\n', x);  % 注意:文件里排布为2行3列,即行优先
%fprintf(fid,'%e  %e  %e\n', x);
fclose(fid);  

空一行:dlmwrite('test.txt', x, '-append', 'roffset', 1, 'delimiter', ' ');
分隔符:dlmwrite('test.txt', x, 'delimiter', '\t', 'precision', '%8.4f');
分隔符:dlmwrite('test.csv', x, 'delimiter', ',', 'precision', '%8.4f', 'newline', 'pc');
dlmwrite函数自动补零对齐;

csvwrite('csvlist.dat', x);  % 逗号隔开 

保存数据、间隔tabs宽度、追加数据:
a=rand(5);
save('a.txt','a','-ascii');  
save('a.txt','a','-ascii','-tabs');  
save('a.txt','a','-append','-ascii','-tabs');
  • 3. 随便写啥

fid=fopen(Fid_FilePath,'wt');
fprintf(fid,'%s\n',Fid_Header); % 写字符串
fprintf(fid,'%10.4f  %10.4f  %10.4f  %10.4f\n', Data_Fid);  % 写数字
fclose(fid);
  • 4. 追加续写

w = 10*rand(1, 4); 
x = 10*rand(1, 3);  
y = 10*rand(1, 2);  
z = 10*rand; 
fid = fopen('test.txt', 'at');   
fprintf(fid, '%-f    %-f    %-f    %-f\n', w);
fprintf(fid, '%-f    %-f    %-f\n', x);
fprintf(fid, '%-f    %-f\n', y);
fprintf(fid, '%-f\n', z);
fclose(fid);
  • 实例

    以下是待写入内容:

Title = Peak File
Num of Peaks = 2048
Time(ms)   --   Amplitude--       Real  --     Imag
0.0000  36061.1716 -31236.0000  18020.0000
0.0500  36075.8757 -31327.0000  17891.0000
0.1000  36169.9271 -31501.0000  17775.0000
0.1500  36114.7887 -31541.0000  17591.0000

    代码如下:

Title = 'Title = Peak File';
Num = ['Num of Peaks =' num2str(length(Module))];
Name = 'Time(ms)   --   Amplitude--       Real  --     Imag';
[filename, pathname] = uiputfile('*.ddd');   % 随便一个后缀名
FileName = [pathname, filename];
dlmwrite(FileName, Title, 'delimiter', '')   % 不加 append 以覆盖同名文件
dlmwrite(FileName, Num, '-append', 'delimiter', '')    % 追加续写
dlmwrite(FileName, Name, '-append', 'delimiter', '')
dlmwrite(FileName, [SampleTime, Module, DataReal, DataImaginary], '-append', 'delimiter', '\t', 'precision', '%.4f')

 

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐