MATLAB 读取数字字符串混杂的文本文件txt中的数据
目标
分多个数组提取下图文本中的数据
介绍
之前介绍了在txt文本中,内容是以列规整的情况下,可以参考:数据处理技巧(5):MATLAB 读取txt中的数据.上次介绍的主要是处理以下两图,按列排列的情况。
这一次处理是数据比较复杂,直接看本文,每一列不是那么整齐。主要处理三种情况:纯数字、字符+数字、字符+数字+字符+数字的情况。
① 纯数字的情况
需要读取的文本文件:
判断文件路径
判断输入的文本文件路径是否正确,如果输入了一个错误的文件名,会提示“错误信心+文件打开失败。”的提示。
输入了正确的文件路径之后,读取数据结束,会出现“成功读取文件数据”的提示。
matlab 读取数据的结果
打开工作区的 mdata, 双击 mdata 的 data 变量,可以看到读取的纯数字的数据。
由于matlab 的表格默认显示4位小数,所以看起来不同。实际上 matlab 计算不只显示的4位小数,是可以正常计算的。
代码块
%% purenum
% 创建data数组
mdata.data = [];
FileLoc = "purenum.txt"; % 文本文件所在路径,如果在同一文件夹中,只写文件名即可
[datafid,datamess] = fopen(FileLoc,"r"); % 打开文本文件,只读模式打开
if datafid==-1
% 成功打开,返回非负数;打开失败返回-1
disp(datamess);
disp("文件打开失败。");
else
tline = fgets(datafid); % 先读取第一行
while tline~=-1 % 当一行数据为-1,说明文件所有行遍历结束
data123 = sscanf(tline,'%f',3); % 找到点坐标(序号,x,y,z),记得转置
mdata.data=[mdata.data;data123']; % 存储在数组
tline = fgets(datafid); % 迭代,读下一行
end
fclose(datafid); % 关闭文件
disp("成功读取文件数据。"); % 提示
end
② 文字开头,数字在后的情况
需要读取的文本文件
matlab 读取数据的结果
代码块
%% charnum
% 创建三个数组
mdata.VArray = [];
mdata.rgb = [];
mdata.point = [];
FileLoc = "charnum2.txt"; % 文本文件所在路径,如果在同一文件夹中,只写文件名即可
[datafid,datamess] = fopen(FileLoc,"r"); % 打开文本文件,只读模式打开
if datafid==-1
% 成功打开,返回非负数;打开失败返回-1
disp(datamess);
disp("文件打开失败。");
else
tline = fgets(datafid); % 先读取第一行
while tline~=-1 % 当一行数据为-1,说明文件所有行遍历结束
% 判断行开头的第一个单词
[ln,~,~,n] = sscanf(tline,'%s',1); % 处理这一行的数据
if ln=="Vertex"
tline1=tline(n:end); % 截断-删除Vertex
Vxyz = sscanf(tline1,'%f',3); % 找到点坐标(序号,x,y,z),记得转置
mdata.VArray=[mdata.VArray;Vxyz']; % 存储在数组
end
if ln=="rgb"
tline1=tline(n:end); % 截断-删除Vertex
Vxyz = sscanf(tline1,'%f',3); % 找到点坐标(序号,x,y,z),记得转置
mdata.rgb=[mdata.rgb;Vxyz']; % 存储在数组
end
if ln=="point"
tline1=tline(n:end); % 截断-删除Vertex
Vxyz = sscanf(tline1,'%f',3); % 找到点坐标(序号,x,y,z),记得转置
mdata.point=[mdata.point;Vxyz']; % 存储在数组
end
tline = fgets(datafid); % 迭代
end
fclose(datafid); % 关闭文件
disp("成功读取文件数据。"); % 提示
end
③ 一行文字和数字混杂的情况
需要读取的文件:
matlab 读取数据结果:
代码块
%% charnumcharnum
% 创建三个数组
mdata.VArray = [];
mdata.rgb = [];
mdata.point = [];
FileLoc = "charnumcharnum.txt"; % 文本文件所在路径,如果在同一文件夹中,只写文件名即可
[datafid,datamess] = fopen(FileLoc,"r"); % 打开文本文件,只读模式打开
if datafid==-1
% 成功打开,返回非负数;打开失败返回-1
disp(datamess);
disp("文件打开失败。");
else
tline = fgets(datafid); % 先读取第一行
while tline~=-1 % 当一行数据为-1,说明文件所有行遍历结束
% 判断行开头的第一个单词
[ln,~,~,n] = sscanf(tline,'%s',1); % 处理这一行的数据
if ln=="Vertex"
tline1=tline(n:end); % 截断-删除Vertex
Vxyz = sscanf(tline1,'%f',3); % 找到点坐标(序号,x,y,z),记得转置
mdata.VArray=[mdata.VArray;Vxyz']; % 存储在数组
% 找 rgb
k1 = strfind(tline, 'rgb');
if k1>0
k1=k1+3; % 找到删去rgb的最后位置
tline1=tline(k1:end);
rgb = sscanf(tline1,'%f',3); % 找到 rgb
mdata.rgb=[mdata.rgb;rgb']; % 存储在数组里
end
% 找 point
k2 = strfind(tline, 'point');
if k2>0
k2=k2+5; % 找到删去 point 的最后位置
tline2=tline(k2:end);
point = sscanf(tline2,'%f',3); % 找到 point
mdata.point=[mdata.point;point']; % 存储在数组里
end
end
tline = fgets(datafid); % 迭代
end
fclose(datafid); % 关闭文件
disp("成功读取文件数据。"); % 提示
end
结尾
通过这次介绍,可以很快速地用 matlab 提取文本文件中的数据,以备后续 matlab 处理。 结合 数据处理技巧(5):MATLAB 读取txt中的数据 应该能解决很多读取数据的问题啦。