2016-03-21 15 views
0

私は観測の複数のセクションを持つテキストファイルを持っています。新しい観測が開始されるたびに、ファイルには後続のデータに関する情報(ファイルのヘッダーのような)があります。matlabを使用してテキストファイルの途中にヘッダ行を無視します

textscanを使用した場合、最初のセクションのみを読むことができました。たとえば、次のようにデータが配置されている:

1993-01-31 17:00:00.000 031  -61.00 

1993-01-31 18:00:00.000 031  -55.00 

1993-01-31 19:00:00.000 031  -65.00 

Format             
Source of Data       
Station Name    
Data Interval Type  1-hour          
Data Type    Final           

1993-02-01 00:00:00.000 032  -83.00 

1993-02-01 01:00:00.000 032  -70.00 

1993-02-01 02:00:00.000 032  -64.00 

以上のことから、私は途中でテキストのブロックを無視して「1993」で始まるデータ・ラインを読みたいです。

+0

あなたはつもりだが、ファイルの行ごとに解析し、またはにファイルにいくつかの前処理を適用する必要がこれらのヘッダ行を削除してください( 'grep'や' sed' UNIXツールを使って[a-zA-Z]で始まる行を削除してください) – Amro

答えて

2

あなたが気付いたように、textscanは入力を解析できなくなったときに読み込みを停止します。実際にこれをあなたの利益に利用することができます。たとえば、あなたの場合、すべての「良い」データセットの間に5行のゴミがあることがわかります。したがって、textscanを一度実行して最初のセットを取得した後、それを連続して実行して(Headerlinesを5に設定して5行を無視して)、ファイル内の「良い」データセットをそれぞれ取得します。次に、すべてのデータを連結します。

ファイル識別子にtextscanを使用すると、がファイル識別子の末尾に戻るように巻き戻されないため、これが機能します。それは、それを解析することができなくなったところでそれを残す。したがって、あなたがオフに左(マイナス指定した任意のヘッダ行)右textscan開始の次の呼び出し

fid = fopen(filename, 'r'); 

% Don't ignore any lines but read until we stop 
data = textscan(fid, formatspec); 

% Repeat until we hit the end of the file 
while ~feof(fid) 
    % Skip 5 lines and read until we can't read anymore 
    newdata = textscan(fid, formatspec, 'HeaderLines', 5); 

    % Append to existing data 
    data = cellfun(@(x, y)cat(1, x, y), data, newdata, 'uni', 0); 
end 

fclose(fid) 
+0

'formatspec'とは何ですか? – Mushi

+0

@Mushiこれは、元々ファイルを解析するために使用した書式指定子です。私はあなたがあなたの事件で使ったことを知らなかったので、私はそれを変数にしました。あなたがあなたの質問にこれを解析しようとしたコードを投稿した場合、私はこれをこれに入れることができます。 'textscan'への2番目の入力です – Suever

+0

尋ねると申し訳ありません。私は質問をした後にそれを実現しました。今、問題は、私が得ているデータが連結されていないことです。私は観測数に等しい数のチャンクを持っています。各チャンクはセルの形式です。どのようにそれを修正するための任意のアイデア。 – Mushi

関連する問題