当前位置:网站首页>数据处理技巧(7):MATLAB 读取数字字符串混杂的文本文件txt中的数据

数据处理技巧(7):MATLAB 读取数字字符串混杂的文本文件txt中的数据

2022-07-06 14:21:00 娱乐至上2091

目标

分多个数组提取下图文本中的数据

在这里插入图片描述

在这里插入图片描述

介绍

     之前介绍了在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中的数据 应该能解决很多读取数据的问题啦。

原网站

版权声明
本文为[娱乐至上2091]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44115959/article/details/125571038