Matlab для чтения в текстовом файле с фиксированной шириной

У меня есть текстовый файл, как показано ниже:

TestData                                                                     

  6.84 11.31 17.51 22.62 26.91 31.98 36.47 35.85 28.47 20.57 10.50  6.37  test1
  0.24  2.62  4.94  7.17 10.39 15.37 18.73 18.29 12.26  6.46  1.15 -0.33  test2
 68.47 95.04156.07218.39304.31320.22311.69269.22203.01135.60 68.18 55.09  test3

 68.47 95.04156.07218.39304.31320.22311.69269.22203.01135.60 68.18 55.09  test4
...

Как видите, первые две строки — это комментарии, которые следует игнорировать. В следующих строках также есть комментарий в конце каждой строки. Каждое число имеет вид %6f. Кроме того, между ними есть пустые строки.

Я хочу прочитать все числа в матрицу, чтобы построить графики. Я пытался использовать textscan, но у меня были проблемы с игнорированием последнего столбца, пустых строк и чтением связанных чисел (например, некоторых чисел в строке: test4).

Вот код, который у меня есть сейчас:

data=dir('*.txt');
formatspecific='%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f';
for i=1:length(data);
    TestData1=data(i).name;
    tempData=textscan(TestData1,formatspecific,'HeaderLines',2);
end

Кто-нибудь может помочь сделать пример кода для улучшения части textscan?


person James    schedule 19.10.2015    source источник
comment
опубликуйте код, который у вас уже есть   -  person m.s.    schedule 19.10.2015
comment
Почему вы не указали последнюю строку в своем формате? Это все, что вам нужно сделать, а затем просто уничтожьте строку в своем результате.   -  person Adriaan    schedule 19.10.2015
comment
Даже я помещал строки в формат, я просто получил 13 пробелов [] на выходе. Ты знаешь почему?   -  person James    schedule 19.10.2015
comment
importdata не работает, и я использовал TEXTSCAN или FREAD для более сложных форматов.   -  person James    schedule 19.10.2015


Ответы (1)


Чтобы использовать textscan для чтения файла, вы должны "открыть" его перед вызовом textscan и "закрыть" его после; вы должны использовать

  • fopen, чтобы открыть входной файл
  • fclose чтобы закрыть входной файл

textscan возвращает cellarray с содержимым, прочитанным из входного файла; поскольку вы читаете более одного файла, вам следует изменить способ управления массивом ячеек, возвращаемым textscan, на самом деле, как сейчас в вашем коде, данные перезаписываются при каждой итерации.

Одной из возможностей может быть сохранение данных в массиве struct, например, 2 fields: имя входного файла и данные.

Другая возможность может состоять в том, чтобы сгенерировать struct каждое поле которого содержит данные, считанные из входного файла; вы можете автоматически сгенерировать имя файла.

Другой возможностью может быть сохранение их в матрице.

Далее вы можете найти скрипт, в котором реализованы эти три альтернативы.

Код обновлен (после получения комментария)

Чтобы иметь возможность правильно читать данные, такие как 95.04156.07 как 95.04 156.07, спецификатор формата должен быть изменен с %6f на %6.2f

% Get the list of input data
data=dir('input_file*.txt');
% Define the number of data column
n_data_col=12;
% Define the number of heared lines
n_header=2;
% Build the format specifier string
% OLD format specifier
formatspecific=[repmat('%6f',1,n_data_col) '%s']
% NEW format specifier
formatspecific=[repmat('%6.2f',1,n_data_col) '%s']
% Initialize the m_data matrix (if you know in advance the numer of row of
% each input file yoiu can define since the beginning the size of the
% matrix)
m_data=[];
% Loop for input file reading
for i=1:length(data)
   % Get the i-th file name
   file_name=data(i).name
   % Open the i-th input file
   fp=fopen(file_name,'rt')
   % Read the i-th input file
   C=textscan(fp,formatspecific,'headerlines',n_header)
   % Close the input file
   fclose(fp)
   % Assign the read data to the "the_data" array struct
   the_data(i).f_name=file_name
   the_data(i).data=[C{1:end-1}]
   % Assign the data to a struct whos fileds are named after the inout file
   data_struct.(file_name(1:end-4))=[C{1:end-1}]
   % Assign the data to the matric "m_data
   m_data=[m_data;[C{1:end-1}]]
end

Входной файл

TestData                                                                     

  6.84 11.31 17.51 22.62 26.91 31.98 36.47 35.85 28.47 20.57 10.50  6.37  test1
  0.24  2.62  4.94  7.17 10.39 15.37 18.73 18.29 12.26  6.46  1.15 -0.33  test2
 68.47 95.04156.07218.39304.31320.22311.69269.22203.01135.60 68.18 55.09  test3

 68.47 95.04156.07218.39304.31320.22311.69269.22203.01135.60 68.18 55.09  test4

Вывод

m_data =

  Columns 1 through 7

    6.8400   11.3100   17.5100   22.6200   26.9100   31.9800   36.4700
    0.2400    2.6200    4.9400    7.1700   10.3900   15.3700   18.7300
   68.4700   95.0400  156.0700  218.3900  304.3100  320.2200  311.6900
   68.4700   95.0400  156.0700  218.3900  304.3100  320.2200  311.6900

  Columns 8 through 12

   35.8500   28.4700   20.5700   10.5000    6.3700
   18.2900   12.2600    6.4600    1.1500   -0.3300
  269.2200  203.0100  135.6000   68.1800   55.0900
  269.2200  203.0100  135.6000   68.1800   55.0900

Надеюсь это поможет.

person il_raffa    schedule 19.10.2015
comment
Спасибо. Это очень ясно и очень полезно. Но textscan игнорирует начальные пробелы, а матрица C неверна для строки test4. Например, третье число в test4 — 56,072, а должно быть 156,07. - person James; 20.10.2015
comment
Извините за этот поздний ответ. Я обновил код, теперь 95.04156.07 правильно читается как 95.04 и 156.07. Из вашего комментария неясно, хотите ли вы распознавать пустые строки (например, между test3 и test4. Если да, то что вы хотите вставить в матрицу? - person il_raffa; 20.10.2015
comment
Спасибо. Пустая строка может быть либо оставлена ​​0, либо просто удалена. Программа работает нормально. - person James; 21.10.2015
comment
Не за что, вроде как из-за первоначальной ошибки. Возможно, вы захотите принять ответ, чтобы закрыть вопрос. - person il_raffa; 21.10.2015