MATLAB数据文件处理(txt,mat,excel等)

简介

在做一些关于数据采集的实验时,例如利用dSpace做硬件在环、CAN分析仪、示波器等硬件采集的车辆测试数据时,需要在MATLAB软件中对这些采集的数据进一步分析或者处理时,通过这些采集得到的数据得到的一般为 txt,excel,mat等文件,这些文件一般具有固定的记录样式,但是经常缺乏一种处理方法能够快速的导入到MATLAB工作空间中,作为进一步的分析。
对这些具有固定格式的数据文件处理时,经常采用正则表达式进行快速检索和定位,达到提取数据信息的目的。由于不同的数据记录文件具有不同的数据结构,因此需要采用不同的数据提取方法采用适配不同的数据记录文件,以下提供几种文件格式的示例输出样式,并对这些样式做出通用的处理方法。

txt文件

txt数据采集得到的示例样式如下:
在这里插入图片描述
该数据记录的样式为:
1、第一行为数据的名称
2、从第二行开始为每个变量对应的时间序列采集数据值
3、数据的名称和数据的数值之间均通过 tab 分割

处理方法

函数如下:其中输入量 FilePath 为所要处理文本文件所在的完整路径。
输出为处理后的数据汇总。
利用正则表达式对数据关键操作:

  1. Data = regexp(text,’\r\n|\n’,‘split’)’;
    解释: 将每一行的数据分割为每一个cell类型,整个text文件的每一行均对应Data 这个cell元胞数组的每一个元素
  2. VarNames = regexp(Data{1},’\t’,‘split’);
    解释:对文本的第一行的数据名称提取
  3. VarNames = regexprep(VarNames, ‘^\s*|\s*$’, ‘’);
    解释:对数据名称最前面的空白或者最后面的空白去除,例如名称为 ‘ __ var __’ 转换为‘var’
  4. Data_instant = str2num(Data{i});
    解释:对每一行的数据转换为数值
function MatData = readTextFile(FilePath)
 	fid = fopen(FilePath);
    text = fscanf(fid, '%c');
    fclose(fid);    
    Data = regexp(text,'\r\n|\n','split')';
    while isempty(Data{end})
        Data(end) = [];
    end
    VarNames = regexp(Data{1},'\t','split');
    VarNames = regexprep(VarNames, '^\s*|\s*$', '');
    Values = zeros((length(Data)-1), length(VarNames));
    length_VarNames = length(VarNames);
    IdxToDelete = [];
    IdxEmptyLine = [];
    length_data = length(Data);
    for i=2:1:length_data
        Data_instant = str2num(Data{i});
        if length(Data_instant) == length_VarNames
            Values(i-1,:) = Data_instant;       
        elseif isempty(Data_instant)
            IdxEmptyLine = [IdxEmptyLine, i-1];        
        else        
            IdxToDelete = [IdxToDelete, i-1];          
        end
    end
    if length(IdxToDelete)>1000
        msgbox(['数据中有太多不符合规范,请使用正确的格式重试'],'规范不符')    
    end
    Values(IdxEmptyLine, :) = [];
    Values(IdxToDelete, :) = [];
    if ~isempty(IdxToDelete)
        msgbox(['Line(s) ', num2str(IdxToDelete),' are delete.'],'Unexpected Data')
    end
    MatData.Values = Values;
    MatData.VarNames = cell(1, length(VarNames));

最后将得到的变量名称和数值均保存在 MatData 中。

由于变量名称后附带单位,固定的格式为 变量名[变量单位],例如 Timestamp[sec],采用以下函数对变量名和变量单位提取:

function [ VarName, Unit ] = separateNameAndUnitForRawData( VarName )
if ~ischar( VarName )
    Unit = [  ];
    return ;
end
Unit = converCell2String( regexp( VarName, '\[.*\]', 'match' ) );
Unit = regexprep( Unit, '\[|\]', '' );
end
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

AutoMarie

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值