Читать текстовый файл в Matlab - PullRequest
7 голосов
/ 08 февраля 2012

У меня проблема с чтением файла txt , который содержит 10 столбцов и 2 строки заголовка, но проблема в том, что в середине файла один и тот же заголовок появляется несколько раз, а textread() - нетфункция.Вот мой пример файла:

file.txt

headerline1 aaaa
headerline2 111 123
20/12/2000 name1 name2 name3... name8 0
21/12/2000 name1 name2 name3... name8 0
22/12/2000 name1 name2 name3... name8 0
headerline1 aaaa
headerline2 111 123
25/12/2000 name1 name2 name3... name8 0
27/12/2000 name1 name2 name3... name8 0
...

, и это мой код, который я попробовал:

[date, name1, name2, name3, name4, name5, name6, name7, name8, status] = ...
    textread('file.txt', '%s %s %s %s %s %s %s %s %s %d', 'headerlines',2);

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

Спасибо за помощь.

Ответы [ 2 ]

6 голосов
/ 08 февраля 2012

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

Вот пример:

%# read the whole file to a temporary cell array
fid = fopen(filename,'rt');
tmp = textscan(fid,'%s','Delimiter','\n');
fclose(fid);

%# remove the lines starting with headerline
tmp = tmp{1};
idx = cellfun(@(x) strcmp(x(1:10),'headerline'), tmp);
tmp(idx) = [];

%# split and concatenate the rest
result = regexp(tmp,' ','split');
result = cat(1,result{:});

%# delete temporary array (if you want)
clear tmp
2 голосов
/ 08 февраля 2012

Если вы НЕ хотите использовать perl, awk или что-то подобное для предварительной обработки ваших данных (что я действительно мог бы понять), вы можете попробовать прочитать файл построчно, используя fopen, fgetl и feof (например, один пример можно увидеть здесь: https://stackoverflow.com/a/2858208/701049) и проверьте для каждой строки, содержит ли он заголовок. Если это так, continue ваш цикл. Если нет, обработайте его, используя что-то вроде textscan как вы уже сейчас.

...