• 数据处理技巧(7):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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    ② 文字开头,数字在后的情况

    需要读取的文本文件

    在这里插入图片描述

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    ③ 一行文字和数字混杂的情况

    需要读取的文件:

    在这里插入图片描述

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    结尾

         通过这次介绍,可以很快速地用 matlab 提取文本文件中的数据,以备后续 matlab 处理。 结合 数据处理技巧(5):MATLAB 读取txt中的数据 应该能解决很多读取数据的问题啦。

  • 相关阅读:
    深度学习手写字符识别:推理过程
    Loj#3320-「CCO 2020」旅行商问题
    蓝牙资讯|2023年Q2中国可穿戴市场同比增长17%,蓝牙可穿戴发展迅猛
    java计算机毕业设计基于springboo+vue的疫情社区防控系统
    python中的继承
    月薪5万以上的项目经理都达到了哪些标准?
    ObjectMapper 类处理数据转换(json字符床转集合和对象)
    ROS 摄像头标定-camera_calibration
    【视频学习笔记】(霹雳吧啦Wz)MobileNet 系列
    uni-app 之 vue语法
  • 原文地址:https://blog.csdn.net/weixin_44115959/article/details/125571038