2016-09-28 26 views
0

我有一個ascii文件中有很多數據點的模擬數據。我試圖從中提取變量名和它們的值。下面的是什麼樣的文件格式,看起來像一個例子:緩慢regexprep與一個很長的字符串

*ESA 
*COM on Tue Sep 27 15:23:02 2016 
*COM C:\Users\vi813c\Documents\My Matlab\ 
*COM The pathname to the ESB file was: C:\Users\vi813c\Documents\My Matlab 
Case013 
*RTITLE 

Run Date/Time = 20-SEP-2016 13:29:00 
MSC.EASY5 time-history plot with  20001 data points 
*EOD 
*FLOAT 
TIME FDLB(1) FSLB(1) FVLB(1) MXLB(1) \ 
MYLB(1) MZLB(1) FDLB(2) FSLB(2) FVLB(2) \ 
MXLB(2) MYLB(2) MZLB(2) FDLB(3) FSLB(3) \ 
FVLB(3) MXLB(3) MYLB(3) MZLB(3) 
       0   884.439    -0   53645.8  -972.132 
     -311780   207.866   5403.68   1981.49   327781 
     258746 -1.74898E+006   84631.4   5384.25  -1308.47 
     326538  -97028.6 -1.74013E+006  -61858.1 
      0.002   882.616  0.008033   53661.1   -972.4 
     -311702   207.779   5400.42   1982.11   327784 
     258726 -1.74906E+006   84628.3   5381.01  -1308.44 
     326541  -97040.1 -1.74021E+006  -61858.8 
      0.004   876.819  0.031336   53705.6  -973.183 
     -311683   207.661   5391.19   1983.9   327795 
     258693 -1.74935E+006   84624   5371.85  -1309.63 
     326552  -97040.6 -1.74051E+006  -61858.8 
      0.006   869.491  0.061631   53763.3  -974.213 
     -311806   207.618   5377.45   1986.76   327813 
     258659 -1.74995E+006   84621.7   5358.2  -1312.04 
     326569  -97040.3 -1.7411E+006   -61861 
      0.008   861.718  0.095625   53828.1  -975.379 
     -312039   207.648   5360.82   1990.12   327834 

的數據格式的特點總結如下:

  1. 一切之上「*浮動」是一個頭,我需要得到之間去掉它
  2. 東西「* FLOAT」和第一數值是變量名
  3. 的變量名和值由空間(S)分隔和「\」
  4. 的數據被「集總」 。每個塊在給定的模擬時間步中具有變量的值。在上面的例子中,有19個變量,因此每個塊總共有19個數字值。
  5. 可以有多個數據集;每個前面帶有「*浮動」和變量名節

以下是我如何處理目前這樣的數據:

  1. FILEREAD文件 - >字符的一個大的字符串
  2. regexprep { '\ S +' \ ' '\ n'}與', ' - >逗號分隔爲strsplit
  3. strfind 「* FLOAT」
  4. strsplit由',」 - >現在變成了細胞
  5. 找到第一個女士聚體通過值isnan(str2double(分析))
  6. 然後從2.索引和從4索引之間是變量名和從4索引和下一個之間的「* FLOAT」是數字數據

這個方案是有點工作,但我不能停止認爲有一個更好的方式來做到這一點。首先,步驟1非常緩慢。我想這是regexprep處理多個要替換的東西的一大字符串。

我該如何改進腳本?

+1

爲什麼不使用'textscan'或其他解析文件而不是'regexp',因爲這對於一個巨大的字符串來說肯定會很慢。 – Suever

回答

0

我用16b中新增的字符串類給了這個鏡頭。

str = string(fileread('file.txt')); 

fileNewline = [13 newline]; % This data has carriage returns 

str = extractAfter(str, ['*FLOAT' fileNewline]); 
str = erase(str, ['\' fileNewline]); 
str = splitlines(str); 

% Get the variable names 
varNames = split(str(1))'; 

% Get the data 
data = reshape(str(2:end), 4, [])'; 
data = strip(data); 
data = join(data); 
data = split(data); 
data = double(data); 

我不確定如何更快地加載文件。

正如在另一個評論中提到的那樣,textscan可能會有所幫助。它可能最終成爲最快的解決方案。使用指定的正確格式並使用「HeaderLines」選項,我認爲您可以使其工作。

相關問題