汇总一下matlab 读/写文本方法
读文本
1.文本只包含数字、科学记数法;
testfile.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('testfile.txt');
输出为: 7 x 3 矩阵
2.文本只包含数据和字符串(不严格对齐)
testfile.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行开始读取数据,间隔符为空格,跳过前2行
content= importdata('testfile.txt', ' ', 2);
data1 = content.data;
importdata 可以自动区分字符和数字,并分别存储称为结构体,如下
fid = fopen('testfile.txt', 'r');
% 从第3行开始读,然后合并
% 如果是空格隔开的,一定不要添加分隔符
cData = textscan(fid, '%f %f %f', 'HeaderLines', 2, 'CollectOutput', 1);
data2 = cData{1}; % 从元胞数组中提取数据
fclose(fid);
fopen打开文件到fid识别符,textscan识别出来的是cell数据类型,
headline表示跳过的行数;CollectOutput表示是否需要把同一类(基于Matlab的分类法)数据放在一个向量中,1代表true。
3. 数据严格对齐[ 空格分开 ]
testfile.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
可以使用dlmread:
data2 = dlmread('testfile.txt', ' ', 2, 0);
严格对齐且分隔符为空格,可以使用上述函数。输出结果为矩阵,函数中:’ '中表示分隔符为空格,2 表示跳过前2行,0 表示跳过前0列
4. 数据严格对齐[ 逗号分开 ]
testfile.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
还可以使用csvread函数:
data3 = csvread('testfile.txt', 2, 0);
参数同理
5. 数据混杂
testfile.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
content 1
content 2
1 2 3 4
5 6 7 8
可以使用 textscan 函数,注意%f, %s等要和数据个数与类型匹配;分两次读出数据;
fid = fopen('testfile.txt', 'r');
cData = textscan(fid, '%f %f %f', 'HeaderLines', 2, 'Delimiter', ',', 'CollectOutput', 1); % 跳过前2行
data1 = cData{1};
fclose(fid);
fid = fopen('testfile.txt', 'r');
cData = textscan(fid, '%f %f %f %f', 'HeaderLines', 7, 'CollectOutput', 1);
data2 = cData{1};
fclose(fid);
6. 非矩形数据
testfile.txt 文本内容如下:
1 2 3
4 5
6
同样地,使用 dlmread 函数,缺少部分自动补零;
data = dlmread('testfile.txt');
7. 时间形式 [ 多个分割符 ]
testfile.txt 文本内容如下:
2020-4-13, 10:10:10.111 AM
2020-4-14, 10:10:10.111 AM
2020-4-15, 10:10:10.111 AM
使用 textscan 函数,输出的为cell数据类型数据。注意数据个数和类型对齐
fid = fopen('testfile.txt', 'r');
% 用'-,:'作分隔符
A = textscan(fid, '%d %d %d %d %d %f %s','delimiter','-,:','CollectOutput',1);
fclose(fid);
写文本
1. 写数据
% 保存数据、间隔tabs宽度、追加数据:
a = 10*rand(5);
% 科学计数法形式
save('a.txt','a','-ascii'); % 保存为a文件
save('a.txt','a','-ascii','-tabs'); % 保存为a文件,数据之间用Tab间隔
save('a.txt','a','-append','-ascii','-tabs'); % 在a文件后追加内容
% 追加,空一行,分隔符,精度
dlmwrite('test.txt', a, '-append', 'roffset', 1, 'delimiter', '\t', 'precision', '%8.4f');
% 逗号隔开
csvwrite('csvlist.csv', a);
2. 写带有头文件的文本 / 追加文本,(可能也适用于 .dat文件)
data = rand(2,4)
fid=fopen('testfile.txt','wt'); % 注意'wt'参数重要
fprintf(fid,'%s\n', 'head info'); % 头信息
fprintf(fid,'%d %10.4f %10.4f %10.4f\n', data); % 写数据部分,注意个人和类型
fclose(fid);
% 在已经有的文件后追加,'at'
line1 = [1 2 3 4];
line2 = [1 2 3];
line3 = [1 2];
fid = fopen('test.txt', 'at'); % 注意'at'参数重要
fprintf(fid, '%d %d %d %d\n', line1);
fprintf(fid, '%d %d %d\n', line2);
fprintf(fid, '%d %d\n', line3);
fclose(fid);
前后输出的结果见下图:
参考文献
https://www.zhihu.com/search?type=content&q=matlab%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6
https://www.zhihu.com/search?q=matlab%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6&utm_content=search_history&type=content