Сложный текстовый файл с переменными столбцами на строку для MATLAB

У меня есть довольно большой и сложный текстовый файл для чтения в MATLAB. Базовый формат выглядит примерно так:

000723       4       123.12345       5       234.76543   ...    178.94444\n

Первый столбец всегда представляет собой шестизначную дату в формате ггммдд, а последний столбец всегда является двойным с "\ n" в конце и не имеет столбца целых чисел перед ним. "..." указывает, где вы бы увидели больше столбцов, если бы они существовали. Все дополнительные столбцы разбиты на пары и соответствуют формату нескольких предыдущих, а именно:

integer       double

Как я могу это сделать? Кажется, что для большинства вариантов чтения данных мне необходимо знать размеры, но они постоянно меняются с этим набором данных и всегда будут иметь переменные столбцы в каждой строке.

Я бы хотел превратить это в простую матрицу, в которой есть столбцы:

date (from datenum) - double соответствует целому числу 1 - double соответствует целому числу 2 - ... - конечное значение типа double

И если в этой строке не было целого числа, тогда он просто дает 0 или NaN в этом месте матрицы.


person A Blue Shoe    schedule 08.05.2015    source источник
comment
Функция importdata может помочь   -  person Luis Mendo    schedule 09.05.2015
comment
Да, я использовал importdata для этого раньше. Он, по крайней мере, получает значения в MATLAB разумным образом, но столбцы не выравниваются, и мне приходится использовать отдельную функцию, которую я написал, чтобы все это организовать. Я надеялся на более прямой метод «все сразу», чем этот.   -  person A Blue Shoe    schedule 09.05.2015


Ответы (1)


Если importdata не работает, я бы попробовал что-нибудь вроде textscan.

Просто импортируйте ваш файл:

fid = fopen(FILENAME, 'rt');

Затем просто укажите тип данных для столбцов, например:

a = textscan(fid, '%s %f %f %f %f %f');

Затем преобразуйте первый столбец типа String в даты MATLAB и постройте матрицу:

data = datenum(a{1});

[m n] = size(data);
for j=2:1:n
    data = horzcat(data, a{j});
end

Я использовал этот подход для наборов данных раньше, но у вас также есть символ \n, который необходимо учитывать, иначе MATLAB отобразит последний столбец как NaN.

Вот итеративное решение, которое я быстро придумал:

data = [];

%// Iterate through all the lines in the file
tline = fgets(fid);
while ischar(tline)
    %// Remove the newline character from the expression
    str = regexprep(tline,'\\n','');

    %// Vertically concatenated with the global data set
    vertcat(data, textscan(str, '%s %f %f %f %f %f'));

    %// Get the next line
    tline = fgets(fid);
end

Я не могу гарантировать, что эти быстрые образцы кода не содержат ошибок, но я надеюсь, что они вам помогут!

person James Taylor    schedule 09.05.2015