简介
在做一些关于数据采集的实验时,例如利用dSpace做硬件在环、CAN分析仪、示波器等硬件采集的车辆测试数据时,需要在MATLAB软件中对这些采集的数据进一步分析或者处理时,通过这些采集得到的数据得到的一般为 txt,excel,mat等文件,这些文件一般具有固定的记录样式,但是经常缺乏一种处理方法能够快速的导入到MATLAB工作空间中,作为进一步的分析。
对这些具有固定格式的数据文件处理时,经常采用正则表达式进行快速检索和定位,达到提取数据信息的目的。由于不同的数据记录文件具有不同的数据结构,因此需要采用不同的数据提取方法采用适配不同的数据记录文件,以下提供几种文件格式的示例输出样式,并对这些样式做出通用的处理方法。
txt文件
txt数据采集得到的示例样式如下:
该数据记录的样式为:
1、第一行为数据的名称
2、从第二行开始为每个变量对应的时间序列采集数据值
3、数据的名称和数据的数值之间均通过 tab 分割
处理方法
函数如下:其中输入量 FilePath 为所要处理文本文件所在的完整路径。
输出为处理后的数据汇总。
利用正则表达式对数据关键操作:
- Data = regexp(text,’\r\n|\n’,‘split’)’;
解释: 将每一行的数据分割为每一个cell类型,整个text文件的每一行均对应Data 这个cell元胞数组的每一个元素 - VarNames = regexp(Data{1},’\t’,‘split’);
解释:对文本的第一行的数据名称提取 - VarNames = regexprep(VarNames, ‘^\s*|\s*$’, ‘’);
解释:对数据名称最前面的空白或者最后面的空白去除,例如名称为 ‘ __ var __’ 转换为‘var’ - 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