Как извлечь два столбца данных из текста, пропуская определенные строки между данными в MATLAB? - PullRequest
1 голос
/ 28 марта 2019

Я получаю свои данные, как указано ниже (см. Большие данные). Мне нужно извлечь строки данных после 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 Ответ

1 голос
/ 28 марта 2019

При использовании метода textscan вы можете возобновить сканирование . Я включил эту возможность в следующее решение. Я предположил, что вы имеете дело с числовыми данными, поэтому я непосредственно проанализировал вывод массива ячеек 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

Я не хочу копировать и вставлять вывод сюда из-за его длины. Пожалуйста, посмотрите сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...