テキストとバイナリデ​ータ混在のファイルを​読み込むには?

テキストとバイナリデータ混在のファイルを読み込みたい。 以下にファイルの中身の例とデータ構造示します。 データフォーマットはこちらです。
--------------------------------------
《データ構造》
固定ヘッダ行1
固定ヘッダ行2
固定ヘッダ行3
データセットヘッダ行1
データセットヘッダ行2
データセットヘッダ行3
データセットヘッダ行4
データセット1 (512x4バイト)
<CRLF&gt
データセット2 (512x4バイト)
<CRLF&gt
データセット3 (512x4バイト)
<CRLF&gt
データセット4 (512x4バイト)
-------------------------------------------
《ファイルの中身》
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ヒセ・ヲ

1 comentario

Walter Roberson
Walter Roberson el 30 de Jul. de 2017
Approximate translation:
I want to read a file with mixed text and binary data. The following shows an example of file contents and data structure. The data format is here.
--------------------------------------------------------
"data structure"
Fixed header line 1
Fixed header row 2
Fixed header row 3
Data set header line 1
Data set header line 2
Data set header line 3
Data set header line 4
Data set 1 (512 x 4 bytes)
CRLF
Data set 2 (512 x 4 bytes)
CRLF
Data set 3 (512 x 4 bytes)
CRLF
Data set 4 (512 x 4 bytes)
-------------------------------------------------------------
"Contents of file"
[given above. Note that the file contains a number of unprintable characters, so copying and pasting is likely not to give you the exact contents.]

Iniciar sesión para comentar.

 Respuesta aceptada

Tohru Kikawada
Tohru Kikawada el 31 de Jul. de 2017
Editada: Tohru Kikawada el 31 de Jul. de 2017

5 votos

試した方法やプログラムなども含めて投稿していただけると適切な回答が得られるケースが多いです。
テキストとバイナリの読み出し方法のサンプルです。
フォーマットの詳細は理解できていませんが、ご参考になれば幸いです。
% Licel Raw Data Formatのサンプルファイルをダウンロード
url = 'https://github.com/hmjbarbosa/RMlicelUSP/raw/master/RM1120200.012';
file = 'RM1120200.012';
outfilename = websave(file,url);
% ファイルオープン
fid = fopen(file);
% ヘッダー読み込み
for k = 1:3
headers{k} = fgetl(fid);
end
% データセットの数を取り出し
third_header = sscanf(headers{3},'%f');
num_datasets = third_header(end);
% データセットのヘッダーを読み込み
datasetheader = {};
for k = 1:num_datasets
datasetheader{k} = fgetl(fid);
end
fread(fid,2,'uint8') % Read CRLF=13d 10d
% データセットのヘッダーに記載されたデータ分バイナリデータを読み込む
data = {};
for k = 1:num_datasets
dataheader_parsed = sscanf(datasetheader{k},'%d');
num_read = dataheader_parsed(4); %
[data{k},cout] = fread(fid,num_read,'long');
fread(fid,2,'uint8') % Read CRLF=13d 10d
end
% データファイルのクローズ
fclose(fid);
% 行列に整形(各データの数が同じ場合は成功)
DataMat = [data{:}];
plot(DataMat);

9 comentarios

Tohru Kikawada
Tohru Kikawada el 31 de Jul. de 2017
Editada: michio el 31 de Jul. de 2017
よく見たらMATLABのコードもありました。こちらも参考になるかもしれませんね。
nknknknk
nknknknk el 31 de Jul. de 2017
分かりやすいプログラム、ご丁寧なご回答ありがとうございます。
[data{i},cout] = fread(fid,num_read,'long');
の左辺の意味が理解しきれないのですが、どういう意味でしょうか。
② 実行すると、 『エラー fgets ファイルの識別子が無効です。有効なファイルの識別子を生成するには fopen を使用してください。 エラーの発生場所 fgetl (line 34) [tline,lt] = fgets(fid);
エラーの発生場所 bynari (line 70) headers{i} = fgetl(fid);  』 と出ますが、原因はどんな事が考えられるでしょうか、、。
初歩的な質問で申し訳ありませんが、よろしくお願い致します。
michio
michio el 31 de Jul. de 2017
Editada: michio el 31 de Jul. de 2017
① 左辺のどの点についてでしょうか? fread 関数のドキュメントーページ にある
[A,count] = fread(___)
の構文が該当しますので、とりあえず data{i}, cout の意味は出力引数の項目で確認できます。
② Kikawadaさんのコード自体は、こちらでもR2017aでエラーなく実行できました。何か変更されましたか?
まず fread や fgetl でデータを読み取るにはファイルの識別子 fid を fopen で作成しファイルを開いておく必要があります。ご提示のエラーメッセージは、例えば一度 fclose(fid) で閉じてしまった後に fgetl(fid) と使おうとすると発生しますね。。
>> fid = fopen('RM1120200.012');
>> fclose(fid);
>> fgetl(fid)
エラー: fgets
ファイルの識別子が無効です。有効なファイルの識別子を生成するには fopen を使用してください。
エラー: fgetl (line 32)
[tline,lt] = fgets(fid);
Jiro Doke
Jiro Doke el 31 de Jul. de 2017
あと、ファイルが存在しない、ちゃんとダウンロードできていない( websave)、うまく開けてない( fopen)時にも起こりうるエラーですね。エラーが出たときの fid の値はなんですか?現在のフォルダーに RM1120200.012 というファイルが存在しますか?
>> fid
nknknknk
nknknknk el 1 de Ag. de 2017
ご回答ありがとうございます。
①解決しました。
②KikawadaさんのコードをR2012bでそのまま実行すると 「関数 'websave' (タイプ'char' の入力引数) が未定義です。 エラーの発生場所 inst (line 4) outfilename = websave(file,url);」 と出るのは何故でしょうか。
michio
michio el 1 de Ag. de 2017
websave は R2014b で導入された関数だからですね。。url で指定されるサンプルファイルをダウンロードする関数ですが、下記URL
をクリックするだけでもダウンロードされるので、そちらで代用してみてください。
補足ですが例えば、 websave関数のドキュメンテーションページ (Google検索でも引っかかります)の最下部に[R2014b で導入]とあるように、他の関数についても導入されたバージョンが書かれてますので、同じようなトラブルの際には確認してみてくださいませ。 https://jp.mathworks.com/help/matlab/ref/websave.html
Jiro Doke
Jiro Doke el 1 de Ag. de 2017
今後の参考ですが、ご質問される際に使われている MATLAB バージョンを記載していただくと、新しい関数などの使用についても考慮した回答を提供できるかもしれません。
因みに「関数 'xxxxx' が未定義です」のようなエラーは通常、関数名の打ち間違い、そのバージョンの MATLAB に存在しない関数、(ユーザー定義関数の場合)フォルダーにパスが通っていない、等が原因となります。
Tohru Kikawada
Tohru Kikawada el 1 de Ag. de 2017
Michioさんのご提案で問題ないかと思いますが、R2014b以前でしたら websave の代わりに urlwrite を使ってみるとよろしいかと思います。ご参考まで。
nknknknk
nknknknk el 1 de Ag. de 2017
ご丁寧な対応、本当にありがとうございました。 また質問させていただきます。

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre データのインポートとエクスポート en Centro de ayuda y File Exchange.

Preguntada:

el 30 de Jul. de 2017

Comentada:

el 1 de Ag. de 2017

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!