Как прочитать текстовый файл с переменной длиной строки в Matlab?

У меня есть куча файлов CSV для чтения в Matlab. Все файлы имеют одинаковую структуру, за исключением того, что последнее поле является необязательным. т.е. некоторые файлы содержат его, другие нет.

Кроме того, файлы содержат как текстовые, так и числовые поля, поэтому csvread не применяется.

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

Я смотрю спецификацию:

formatSpec = '%d%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%s%[^\n\r]';

и желательно, чтобы последний %s был необязательным.


person Suzan Cioc    schedule 07.04.2015    source источник
comment
Я думаю, вы можете использовать xlsread. Функция предназначена для использования с листами Excel, но я думаю, что она должна работать.   -  person patrik    schedule 07.04.2015


Ответы (3)


Вы можете попробовать функцию strsplit

http://www.mathworks.com/help/matlab/ref/strsplit.html

person Mateo Hrastnik    schedule 07.04.2015

Чтобы прочитать файл построчно, вы можете использовать функцию fgetl. Он читает одну строку, удаляет символы новой строки и возвращает строку в виде строки. В конце файла возвращается -1.

Затем вы можете использовать sscanf для извлечения данных в соответствии с вашей спецификацией формата (включая %s). Если ваши входные данные не содержат строки в конце, то последнее поле было пустым.

fid = fopen('file.txt','r');
while 1
    line = fgetl(fid);
    if line == -1
        break;
    end
    A = sscanf(line,formatSpec);
    ...
end

Затем вы можете делать с A все, что вам нужно.

Например, посмотрите на следующий пример:

line = '1 2.5 3.6 abc';
A = sscanf(line,'%d %f %f %s')

A =
    1.0000
    2.5000
    3.6000
   97.0000
   98.0000
   99.0000

Строка будет A(4:end). Строка была пустой, если isempty(A(4:end)), таким образом вы можете хранить данные как хотите, например. в клетке.

person hbaderts    schedule 07.04.2015

Предполагая, что вам не нужен необязательный столбец, почему бы не игнорировать остальную часть строки с помощью %*s и разделителя, установленного на новую строку?

person mchangze    schedule 30.04.2016
comment
Это небезопасное предположение, так как необязательный не означает нерелевантный. Это может быть очень важно в тех случаях, когда он присутствует. - person Bryan Walker; 30.04.2016