質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

解決済

1回答

2988閲覧

MATLAB ファイル読み込み

Tannnnnnnnnnn

総合スコア24

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

0クリップ

投稿2016/11/24 21:15

観測したzipファイルを手で解凍し、MATLABで読み込む方法についてです。

観測で得られたzipファイルを手動で解凍し、開くと
ーーーーーーーーーー
e16A0319.272413 2016/10/03 19:26
e16A0319.272413 2016/10/03 19:27
・・・
ーーーーーーーーーー
という風に1分ごとに記録された、ファイルが入っています。

その中から、
「e16A0319.272413」
の中身を表示すると、
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
e16A0319.272413
03/10/2016 19:26:23 03/10/2016 19:27:24 0000 0000.0 0000.0 00
0000000 0010 0018952 0010 04
1 0 2 00512 1 0000 0015 00829.o 0 0 00 000 12 150024 0.020 BT1
1 1 2 00512 1 0000 0015 00829.o 0 0 00 000 00 150024 3.1746 BC1
1 0 2 00512 1 0000 0015 00829.o 0 0 00 000 12 150023 0.020 BT1
1 1 2 00512 1 0000 0015 00829.o 0 0 00 000 00 150023 3.1746 BC1
ーーーーーーーーーーーーーーーーーーーーーーーーーー

その下に、
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
邪ラ。ラシゥラOォラそラa泰ラL釐!TリラヨZラョェラ㌘ラtKラTxラ%rラ晗o蹟( ラ・ラュラソCラ 碩>槞遞ラM泰%ャラキラCコラdコラ・ラマララララ=・"ョfリツリタリリVリN/リコ4リ6DリDHリVリリDリヒ_リラaリjリYnリヲyリ|リ>€リヲ筋X筋ト娩壓s」リ。「リgゥリッリyッリ┝リクチリソリ捨リ橆リH籀
゚リチ袙、毖・リハ ." ルYル-ルナル ルア'ルI2ルト6ル・ル・ルカ@ル'Jル祟ルxVル輯ル(cルjdルナiルHlルjルoルョtルモgルミpルnル+uル`pル綠ル2・ツEj\MソMS€・果_ッ・Xオ・T-適・A」・s=FC>輅筋フfヘナシk・u%dロ0ヨа4ヒセ・ヲ
・・・・・・・・・・・・・・・・
ーーーーーーーーーーーーーーーーーーーーーーーーーーー

という表記があり、この部分をMATLABに読み込みたいと考えています。
その後、そのデータでグラフを作成する予定です。
データフォーマットは「http://licel.com/raw_data_format.html」です。

そのためのプログラムに関して、下記で足りない部分、根本的に間違っている部分を教えていただきたいです。
身近に質問できる人がいないためここで質問させていただきました。よろしくお願いします。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
fid = fopen(e16A0319.262265); %ファイルを開く

tline1 = fgetl(fid); %header3行 とばす
tline2 = fgetl(fid);
tline3 = fgetl(fid);

date = fread(fid,512,'long'); %date数 512コ

fclose(fid);
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リンク先のデータフォーマットの説明を読んでみると、ヘッダの3行というのは、固定部分のことで、可変部分もあるようです。固定部分の3行を見ると

e16A0319.272413 03/10/2016 19:26:23 03/10/2016 19:27:24 0000 0000.0 0000.0 00 0000000 0010 0018952 0010 04

で、3行目の 04 のところが、the number of following data sets、つまり、この後に続くデータセットの個数を表しています。この場合は4行のデータセット情報があります。

1 0 2 00512 1 0000 0015 00829.o 0 0 00 000 12 150024 0.020 BT1 1 1 2 00512 1 0000 0015 00829.o 0 0 00 000 00 150024 3.1746 BC1 1 0 2 00512 1 0000 0015 00829.o 0 0 00 000 12 150023 0.020 BT1 1 1 2 00512 1 0000 0015 00829.o 0 0 00 000 00 150023 3.1746 BC1

各行の4番目のフィールドが number of data points、つまりデータセットに含まれるデータの個数です。この場合は、すべて 00512 なので、512個ずつデータがあります。

この後に、実際のバイナリデータが来ますが、The header lines are followed by a <CRLF> and the 32 bit data sets which are separated by a <CRLF>. とありますので、一つのデータは、32ビット、つまり4バイトのデータです。これが、データセットごとに <CRLF> で区切られて並んでいます。

全体の構造としては、

固定ヘッダ行1
固定ヘッダ行2
固定ヘッダ行3
データセットヘッダ行1
データセットヘッダ行2
データセットヘッダ行3
データセットヘッダ行4
データセット1 (512x4バイト)
<CRLF>
データセット2 (512x4バイト)
<CRLF>
データセット3 (512x4バイト)
<CRLF>
データセット4 (512x4バイト)

になっています。32ビットデータのフォーマットについては何も書いていないので、どうやって読み込んだらいいのか正確にはわからないのですが、リトルエンディアンの整数と仮定したコードは

MATLAB

1fid = fopne('e16A0319.272413'); 2 3% 最初の2行は捨てて、3行目を残す 4for i = 1:3 5 header = fgetl(fid); 6end 7 8% 3行目からデータセットの個数を求める 9fields = strsplit(header); 10num_datasets = str2double(fields{5}); 11 12% 各データセットのデータの個数を求める 13num_data = zeros(1, num_datasets); 14for i = 1:num_datasets 15 header = fgetl(fid); 16 fields = strsplit(header); 17 num_data(i) = str2double(fields{4}); 18end 19 20% 各データセットの読み込み 21data = cell(1, num_datasets); 22for i = 1:num_datasets 23 data{i} = fread(fid, num_data(i), 'long'); 24 25 % <CRLF> の読み飛ばし 26 if i ~= num_datasets 27 fread(fid, 1, 'short'); 28 end 29end 30 31fclose(fid); 32

のようになります。実データがないので試してないので、注意してください。

投稿2016/11/25 00:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tannnnnnnnnnn

2016/11/25 22:44

丁寧なご回答本当に感謝します。 ファイルの構造や意味を理解できました。 全ての観測データが、データセット4、データ512×4バイトの場合は以下のプログラムで合っているでしょうか。 ------------------------------------------------------------ fid = fopen('e16A0319.272413','r'); % 各データセットの読み込み data = cell(1, 4); for i = 1:4 data{i} = fread(fid, 512, 'long'); % <CRLF> の読み飛ばし if i ~= 4 fread(fid, 1, 'short'); end end fclose(fid); ------------------------------------------------------------- なお、データ部を3行分バイナリエディタで表示したものはこちらです。 50 4B 03 04 14 00 00 00 08 00 9B 56 21 49 85 7B D0 18 9B 16 00 00 3A 22 00 00 16 00 00 00 31 36 30 39 30 36 2F 65 31 36 39 30 31 31 30 2E 35 32
退会済みユーザー

退会済みユーザー

2016/11/26 03:12

ヘッダ部分の7行を読み飛ばした後は、そのコードでいいと思います。 4バイトのバイナリデータについては、フォーマットが明記されていないので、確かなことはわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問