MATLAB如何提取復(fù)雜文本中的數(shù)據(jù)

這篇文章主要介紹MATLAB如何提取復(fù)雜文本中的數(shù)據(jù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的商丘網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

其實(shí)也不能算是復(fù)雜文本,還是有規(guī)律的。這個(gè)文本裝的是我實(shí)驗(yàn)室設(shè)備采集到的數(shù)據(jù),如下:

MATLAB如何提取復(fù)雜文本中的數(shù)據(jù)

數(shù)據(jù)被我碼掉了一部分,我需要提取出框住的那部分?jǐn)?shù)據(jù),這是一個(gè)矩陣,他上邊的列號(hào)和左邊的行號(hào)都是傳感器的序號(hào)。

讀取數(shù)據(jù)的簡(jiǎn)單思路:

通過(guò)觀察可以發(fā)現(xiàn),我們想要獲取的數(shù)據(jù)都是在CH#開(kāi)頭的行的后面,而且這個(gè)行的后面都是數(shù)值!所以這就很簡(jiǎn)單了:

  • 我們用一個(gè)while循環(huán),把到達(dá)文件尾作為結(jié)束條件,

  • 每次循環(huán)中判斷一下是否已經(jīng)走過(guò)了CH#開(kāi)頭的行,

  • 如果沒(méi)走過(guò)CH#開(kāi)頭的行就繼續(xù),

  • 如果走過(guò)了CH#開(kāi)頭的行就開(kāi)始讀數(shù)。

下面直接上代碼,再做一些簡(jiǎn)單的說(shuō)明

clc
clear

%% 文件打開(kāi)對(duì)話框,選擇文件
[file, path] = uigetfile({'*.TXT'}, '選擇走時(shí)文件');
% 如果沒(méi)有選擇文件就退出
if file == 0
    return
end
% 文件完整路徑
fullPath = [path, file];

%% 打開(kāi)文件
fid = fopen(fullPath, 'r');

%% 保存結(jié)果的矩陣
ElapsTimeData = [];

%% 標(biāo)志開(kāi)始模式為'^CH#',開(kāi)始標(biāo)志的初值為0
startParten = '^CH#';
startFlag = 0;
%% 循環(huán)讀取文件
while(~feof(fid))
    % 一次循環(huán)讀取一行,并把兩邊的空白去掉
    curLine = strip(fgetl(fid));
    % 如果開(kāi)始標(biāo)志已經(jīng)被設(shè)置為1,而且不是空行,則讀取
    if startFlag == 1 && ~isempty(curLine)
        cur_data = cellfun(@str2double, regexpi(strip(curLine), '\s+', 'split'));
        ElapsTimeData = [ElapsTimeData; cur_data];
    end

    % 當(dāng)碰到startParten時(shí),其下一行開(kāi)始就是走時(shí)數(shù)據(jù)了
    if regexpi(curLine, startParten)
        startFlag = 1;
    end

end

% 刪除第一列,第一列放的是傳感器序號(hào)
ElapsTimeData(:, 1) = [];

關(guān)于regexpi函數(shù)它接受三個(gè)參數(shù):

  • 第一個(gè)是原字符串,

  • 第二個(gè)是我們要匹配的模式,

  • 第三個(gè)參數(shù)是正則表達(dá)式輸出規(guī)則。

上面程序中,加粗黑體的那句

regexpi(strip(curLine), '\s+', 'split')
  • 源字符串就是當(dāng)前行

  • 匹配模式:\s+表示一個(gè)或以上的空格(空白)

  • 輸出規(guī)則:我采用的是split,表示:返回除匹配字符串之外的所有字符串!

所以,我這里將輸出除空白以外的所有字符,而這個(gè)匹配是在匹配到'^CH#'之后才開(kāi)始的,所以我們便能獲得'^CH#'所在行的后面所有行中的數(shù)字了。

如果第三個(gè)參數(shù)使用match的話,則像下面這樣寫也行,就是匹配模式稍微多了點(diǎn)東西!

regexpi(strip(curLine), '\d+\.\d+', 'match')

另外regexpi返回的是一個(gè)細(xì)胞數(shù)組,每一個(gè)匹配到的結(jié)果都放在了單個(gè)細(xì)胞中。所以我這里用的cellfun把每一個(gè)細(xì)胞中的字符轉(zhuǎn)化為數(shù)值:

cur_data = cellfun(@str2double, regexpi(strip(curLine), '\s+', 'split'));

Note:

上面給的代碼中我刪減了處理錯(cuò)誤的代碼,比如說(shuō):不符合上面規(guī)則的文件,或者我們不小心把要提取的部分刪了點(diǎn)數(shù)據(jù),等等。

這些可以用 try - catch 結(jié)構(gòu)來(lái)處理,我就不多說(shuō)了,感興趣的可以自己試試看,實(shí)際在提取數(shù)據(jù)時(shí),最好加上這些處理錯(cuò)誤情況的代碼。

讀取結(jié)果:

MATLAB如何提取復(fù)雜文本中的數(shù)據(jù)

也碼掉一部分?jǐn)?shù)據(jù)

以上是“MATLAB如何提取復(fù)雜文本中的數(shù)據(jù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站標(biāo)題:MATLAB如何提取復(fù)雜文本中的數(shù)據(jù)
分享網(wǎng)址:http://bm7419.com/article10/jjcogo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、電子商務(wù)、商城網(wǎng)站、網(wǎng)站維護(hù)網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化