2015-04-07 3 views
0

У меня есть куча CSV-файлов для чтения в Matlab. Все файлы имеют аналогичную структуру, за исключением того, что последнее поле является необязательным. То есть некоторые файлы содержат его, другие - нет.Как читать текстовый файл с переменной длиной строки в 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 быть необязательным.

+0

Я думаю, вы можете использовать [xlsread] (http://se.mathworks.com/help/matlab/ref/xlsread.html). Функция предназначена для использования в листах excel, но я думаю, что она должна работать. – patrik

ответ

0

Для чтения файла строка за строкой, вы можете использовать функцию 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)), таким образом вы можете хранить данные по своему усмотрению, например. в ячейке.

0

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

+0

Это не безопасное предположение, поскольку «необязательный» не означает «неуместное». Это может быть очень важно в тех случаях, когда оно присутствует. –

Смежные вопросы