如何从文本中提取两列数据,同时在MATLAB中跳过数据之间的某些行?

时间:2019-03-27 22:05:46

标签: matlab

我得到的数据如下(请参阅大数据)。我需要在文本文件的第19行之后提取数据行。为此,我可以使用以下代码。

filename= ['f.rpt'];

fid = fopen(filename);
A =  textscan(fid, '%f %f','HeaderLines',19) ;
b = A{2};
fclose(fid);   

但是,这只会读取和提取数据,直到包含

的行为止
Field Output reported at nodes for part: PART-2-1

            Node       CSMAXSCRT
           Label          @Loc 1
---------------------------------

我想跳过那些不属于数据两列的行,并从下面的行中提取数据。问题是,我无法弄清楚如何跳过这些行并仅提取两列数据。我要跳过的间歇数据的位置不是恒定的,并且会随着不同的输出而变化。有办法吗?

********************************************************************************
Field Output Report

Source 1
---------

   ODB: ffffff
   Step: Step-1
   Frame: Increment      7600: Step Time =   6.0000E-011

Loc 1 : Nodal values from source 1

Output sorted by column "CSMAXSCRT General_Contact_Domain".

Field Output reported at nodes for part: PART-1-1

            Node       CSMAXSCRT
           Label          @Loc 1
---------------------------------
               1              1.
               2              1.
               3              1.
               4              1.
             456              1.
             455              1.
             454              1.
             453              1.
             452              1.
             451              1.
             450              1.
              12              1.
              13              1.
              14              1.
              15              1.
              16              1.
              17              1.
              18              1.
              19              1.
              20              1.
              21              1.

   Field Output reported at nodes for part: PART-2-1

            Node       CSMAXSCRT
           Label          @Loc 1
---------------------------------
               1              1.
               2              1.
               3              1.
               4              1.
               5              1.
               6              1.
               7              1.
               8              1.
               9              1.
              10              1.
              11              1.
              12              1.
              13              1.
              14              1.
              15              1.
              16              1.
              17              1.
              18              1.
              19              1.
              20              1.
              21              1.
              22              1.
              23              1.

   Field Output reported at nodes for part: PART-3-1

            Node       CSMAXSCRT
           Label          @Loc 1
---------------------------------
               1              1.
               2              1.
               3              1.
               4              1.
               5              1.
               6              1.
               7              1.
               8              1.
               9              1.
              10              1.
              11              1.
              12              1.
              13              1.
              14              1.
              15              1.
              16              1.
              17              1.
              18              1.
              19              1.
              20              1.
              21              1.
              22              1.
              23              1.   

1 个答案:

答案 0 :(得分:1)

使用textscan方法时,您可以resume scanning。我将这种可能性纳入以下解决方案中。我假设您处理的是数字数据,因此我直接相应地解析了textscan的单元格数组输出。如果不需要,则需要修改数据附加。

% Read in whole text.
text = fileread('f.txt');

% Initialize result array.
C = [];

% Initialize absolute cursor position.
absPos = 0;

% While absolute cursor position hasn't reached EOF.
while (absPos < numel(text))

  % First read -> Skip 19 header lines.
  if (absPos == 0)
    [data, relPos] = textscan(text, '%f %f', 'HeaderLines', 19);
    absPos = absPos + relPos;

  % Every further read -> Skip 5 intermediate header lines.
  else
    [data, relPos] = textscan(text((absPos+1):end), '%f %f', 'HeaderLines', 5);
    absPos = absPos + relPos;
  end

  % Append data.
  C = [C; [data{:}]];
end

由于其长度,我不想将输出复制粘贴到此处。请自己看看。