web-dev-qa-db-ja.com

Matlabでテキストファイルを読む

10列と2行のヘッダーを含むtxtファイルの読み取りに問題がありますが、問題は、ファイルの途中で同じヘッダーが数回表示され、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);

ヘッダーが繰り返されている行で正確にエラーが発生します。これらのヘッダーを回避してファイル全体を読み取る方法について何かアイデアはありますか?問題は、これらの種類のファイルが何百もあるため、毎回手動で削除できないことです。

手伝ってくれてありがとう。

7
Mallvina

最初に、textscanを使用して、ファイルを1行ずつ読み取ることができます。次に、ヘッダー行を削除し、残りを処理します

次に例を示します。

%# 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
6
yuk

Perlやawkなどを使用してデータを前処理したくない場合(私は実際に理解できます)、fopenfgetlfeof(たとえば、ここに1つの例があります: https://stackoverflow.com/a/2858208/701049 )そして、ヘッダーが含まれているかどうかを各行で確認します。もしそうなら、あなたのループをcontinue。そうでない場合は、すでに行っているようにtextscanのようなものを使用して処理します。

2
tim