使用非常长的字符串缓慢regexprep

时间:2016-09-28 15:42:39

标签: matlab

我在具有大量数据点的ascii文件中有模拟数据。我正在尝试从中提取变量名称及其值。以下是文件格式的示例:

*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. “* FLOAT”以上的所有内容都是标题,我需要摆脱它
  2. “* FLOAT”和第一个数值之间的东西是变量名称
  3. 变量名称和值由空格和'\'
  4. 分隔
  5. 数据是“集中”的。每个肿块都有给定模拟时间步长的变量值。在上面的示例中,有19个变量,因此每个块中有19个数值
  6. 可以有多个数据集;每个前面都有“* FLOAT”和变量名称部分
  7. 以下是我目前处理此数据的方式:

    1. fileread the file - >一大串字符
    2. regexprep {'\ s +,'\','\ n'}带',' - >逗号分隔为strsplit
    3. strfind“* FLOAT”
    4. strsplit by',' - >现在变成了一个单元格
    5. 通过isnan(str2double(parse))
    6. 找到第一个数值
    7. 然后在2.的索引和4的索引之间是变量名,在4之间的索引和下一个“* FLOAT”之间是数字数据
    8. 这个方案有点工作,但我不能不再认为必须有更好的方法来做到这一点。首先,步骤1非常慢。我想这是regexprep的一个大字符串,可以处理多个要替换的东西。

      如何改进我的剧本?

1 个答案:

答案 0 :(得分: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);

我不确定如何更快地加载文件。

如另一条评论所述,文本扫描可能有所帮助。它可能最终成为最快的解决方案。如果指定了正确的格式并使用“HeaderLines”选项,我认为您可以使其正常工作。