2017-06-26 5 views
0

私は、多くの行のヘッダー情報とオーバーヘッド情報を含むテキストファイルを持っています。それに続いて、キャプチャに興味のあるデータブロックが繰り返しあります。しかし、最初のブロックはそれに続くブロックとは少し異なります。次のようにファイル構造は次のとおりです。MATLAB解析データファイル

**Header and overhead:** 
... 
... 
... 
SPD -> PX: SS3Data[07]: Recv Data 
Sync:  0xXXXXXXXX 
Chan:  N 
ID:  N 
Seq:  N 
SS:  N 
Words: N 
Time:  0xXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXX 
PX: SS3Data[07]: Recv Data 
Sync:  0xXXXXXXXX 
Chan:  N 
ID:  N 
Seq:  N 
SS:  N 
Words: N 
Time:  0xXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXX 
PX: SS3Data[07]: Recv Data 
Sync:  0xXXXXXXXX 
Chan:  N 
ID:  N 
Seq:  N 
SS:  N 
Words: N 
Time:  0xXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXX 

私が言ったブロック内のデータをキャプチャできるようにしたいと、次のような構造に格納したい:

S.Block1.Sync 
S.Block1.Chan 
S.Block1.Chan 
S.Block1.ID 
S.Block1.Seq 
S.Block1.SS 
S.Block1.Words 
S.Block1.Time 
S.Block1.Data 
. 
. 
. 
S.BlockN.Sync 
S.BlockN.Chan 
S.BlockN.Chan 
S.BlockN.ID 
S.BlockN.Seq 
S.BlockN.SS 
S.BlockN.Words 
S.BlockN.Time 
S.BlockN.Data 

Xの次時間フィールドは16進数です。 1行目は64文字、2行目は32文字です。

答えて

2

この問題の最適な方法は、ファイルのサイズによって異なります。あなたが一度にすべてでそれを読むことができるならば、私は関数textscanを使用して、次のアプローチを示唆している()

% read file => stored in "data.txt" 
fID = fopen(fullfile(cd, 'data.txt'), 'r'); 
tmp = textscan(fID, '%s'); 
fclose(fID); 
lines = tmp{1}; 

% find rows with data. You might want to add some additional checks, or 
% check whether the labels are indeed always in this order 
chan_row = find(strcmpi(lines, 'Chan:'))+1; % could add a check here that the distance between the rows is all the same 

% save in a table 
tbl = table(); 
tbl.Chan = lines(chan_row); 
tbl.ID = lines(chan_row+2); 
tbl.Seq = lines(chan_row+4); 
tbl.SS = lines(chan_row+6); 
tbl.Words = lines(chan_row+8); 
tbl.Time = lines(chan_row+10); 
tbl.Data = lines(chan_row+12); 

私はテーブルに結果を格納していることに注意してください。これはおそらく名前のID番号を持つ構造体よりも処理がはるかに簡単です。フィールドごとに、特定のフィールドをカテゴリに変換するなど、いくつかの追加の変換を行うことができます。

ファイルが非常に大きいため実行できない場合は、fgetl()と組み合わせてfopen()を試して、行単位で読み込むことができます。

+0

これはほとんどの場合非常にうまくいきました。私は以下のようにData部分を修正しました: temp_DataLine1 = lines(chan_row + 11); temp_DataLine2 =行(chan_row + 12);次に、私は2つをstrcat:tbl.Data = strcat(temp_DataLine1、temp_DataLine2)。 – DeeTee

0

実際にコードに含まれているデータではなく、一度だけのデータ取り込みであれば、メモ帳でデータをctrl-cしてから、Matlabで変数ワークスペースとctrl-vをクリックします。そのデータを簡単にインポートできるウィンドウが表示されます。

関連する問題