这篇文章主要介绍MATLAB如何提取复杂文本中的数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
其实也不能算是复杂文本,还是有规律的。这个文本装的是我实验室设备采集到的数据,如下:
数据被我码掉了一部分,我需要提取出框住的那部分数据,这是一个矩阵,他上边的列号和左边的行号都是传感器的序号。
读取数据的简单思路:
通过观察可以发现,我们想要获取的数据都是在CH#开头的行的后面,而且这个行的后面都是数值!所以这就很简单了:
我们用一个while循环,把到达文件尾作为结束条件,
每次循环中判断一下是否已经走过了CH#开头的行,
如果没走过CH#开头的行就继续,
如果走过了CH#开头的行就开始读数。
下面直接上代码,再做一些简单的说明
clc
clear
%% 文件打开对话框,选择文件
[file, path] = uigetfile({'*.TXT'}, '选择走时文件');
% 如果没有选择文件就退出
if file == 0
return
end
% 文件完整路径
fullPath = [path, file];
%% 打开文件
fid = fopen(fullPath, 'r');
%% 保存结果的矩阵
ElapsTimeData = [];
%% 标志开始模式为'^CH#',开始标志的初值为0
startParten = '^CH#';
startFlag = 0;
%% 循环读取文件
while(~feof(fid))
% 一次循环读取一行,并把两边的空白去掉
curLine = strip(fgetl(fid));
% 如果开始标志已经被设置为1,而且不是空行,则读取
if startFlag == 1 && ~isempty(curLine)
cur_data = cellfun(@str2double, regexpi(strip(curLine), '\s+', 'split'));
ElapsTimeData = [ElapsTimeData; cur_data];
end
% 当碰到startParten时,其下一行开始就是走时数据了
if regexpi(curLine, startParten)
startFlag = 1;
end
end
% 删除第一列,第一列放的是传感器序号
ElapsTimeData(:, 1) = [];
关于regexpi函数它接受三个参数:
第一个是原字符串,
第二个是我们要匹配的模式,
第三个参数是正则表达式输出规则。
上面程序中,加粗黑体的那句
regexpi(strip(curLine), '\s+', 'split')
源字符串就是当前行
匹配模式:\s+
表示一个或以上的空格(空白)
输出规则:我采用的是split
,表示:返回除匹配字符串之外的所有字符串!
所以,我这里将输出除空白以外的所有字符,而这个匹配是在匹配到'^CH#'之后才开始的,所以我们便能获得'^CH#'所在行的后面所有行中的数字了。
如果第三个参数使用match的话,则像下面这样写也行,就是匹配模式稍微多了点东西!
regexpi(strip(curLine), '\d+\.\d+', 'match')
另外regexpi返回的是一个细胞数组,每一个匹配到的结果都放在了单个细胞中。所以我这里用的cellfun把每一个细胞中的字符转化为数值:
cur_data = cellfun(@str2double, regexpi(strip(curLine), '\s+', 'split'));
Note:
上面给的代码中我删减了处理错误的代码,比如说:不符合上面规则的文件,或者我们不小心把要提取的部分删了点数据,等等。
这些可以用 try - catch 结构来处理,我就不多说了,感兴趣的可以自己试试看,实际在提取数据时,最好加上这些处理错误情况的代码。
读取结果:
也码掉一部分数据
以上是“MATLAB如何提取复杂文本中的数据”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。