以前处理陀螺数据文本文件,里面有中文、英文,MATLAB导入数据识别起来比较麻烦。
对象:中英数字混合的、行列对其的文本。例如如下文本内容(可以保存为matlab.txt跑下实例程序):
序号 传输方向 接收时间标识 帧ID 帧格式 帧类型 数据长度 数据
0 接收 0x05be9f80 0x00000003 数据帧 扩展帧 0x08 ff 3f fe fe ed 63 00 02
1 接收 0x05be9f88 0x00000004 数据帧 扩展帧 0x08 03 10 00 00 22 01 00 00
2 接收 0x05be9f8e 0x00000001 数据帧 扩展帧 0x08 00 00 00 00 01 34 00 00
3 接收 0x05be9f96 0x00000002 数据帧 扩展帧 0x08 00 ab 00 48 ee ff 00 01
4 接收 0x05be9f9e 0x00000003 数据帧 扩展帧 0x08 ff 32 ff ff ea 6d 00 09
5 接收 0x05be9fa6 0x00000004 数据帧 扩展帧 0x08 07 a0 00 00 e4 b1 00 00
。。。。。。
目的:中英数字混合文本的数字提取。需要提取本文中 0x08 后面的16进制数据。且文件中 帧ID为 0x00000001 - 0x00000004才为一个完整的帧数据,下面程序里面用i,j控制取到正确顺序的四帧数据。
实例:(有参考网上部分)
clear all;
close all;
fidin=fopen('C:\Users\Administrator\Desktop\canshuju.txt'); %文件形式读入
fidout=fopen('matlab.txt','wt'); % 创建matlab.txt文件
i=0;j=0;
while ~feof(fidin) % 判断是否为文件末尾
tline=fgetl(fidin); % 从文件读行
ind1=strfind(tline,'0x00000001');%找到文件中的字符串0x00000001,可以为中文
strlen1=strfind(tline,'0x08');%找到文件中的字符串0x08
if ~isempty(ind1 & strlen1)%从读取的行里面同时找到上述两个字符串标志,表示是一个完整的行
b1=tline(strlen1+6:strlen1+34);%从读取的行里面提取字符串0x08后面的有用的数据,注意偏移量
if i==0
i=i+1;
end
end
ind2=strfind(tline,'0x00000002');%找到文件中的字符串0x00000002
strlen2=strfind(tline,'0x08');%找到文件中的字符串
if ~isempty(ind2 & strlen2)
b2=tline(strlen2+6:strlen2+34);
if i==1
i=i+1;
end
end
ind3=strfind(tline,'0x00000003');%找到文件中的字符串
strlen3=strfind(tline,'0x08');%找到文件中的字符串
if ~isempty(ind3 & strlen3)
b3=tline(strlen3+6:strlen3+34);
if i==2
i=i+1;
end
end
ind4=strfind(tline,'0x00000004');%找到文件中的字符串
strlen4=strfind(tline,'0x08');%找到文件中的字符串
if ~isempty(ind4 & strlen4)
b4=tline(strlen4+6:strlen4+34);
if i==3
i=i+1;
end
end
if i==4
fprintf(fidout,'55 99 %s %s %s %s 66\n',b1,b2,b3,b4); %\t制表 \n回车%加上55 99 66重新组帧
i=0;
end
end
fclose(fidout);
%补充说明:有的时候数据没对齐,多了一些字符比如℃或者V、:等,在保持的文本中用strrep(b4,'℃','')函数可以去掉。
参考此例子,对于单行提取的的就更简单了,请自行解决。
希望可以帮到一些人,为分享精神做点贡献。大神请无视。