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

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

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

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

Q&A

解決済

1回答

2835閲覧

テキストファイルへの変換

Tannnnnnnnnnn

総合スコア24

MATLAB

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

0グッド

0クリップ

投稿2016/12/12 17:38

観測で得られたファイルをMATLABで読み込めるようにテキストファイルに変換したいです。

まず、1分毎に記録されたファイルが、


e16A0319.272413 2016/10/03 19:26
e16A0319.272413 2016/10/03 19:27
・・・


という風に並んでいます。
その中から、
「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の関数で読み込めるように、テキストファイルに変換したいのですが、下記のプログラムでエラーが出てしまいます。
下記プログラムで足りない部分、根本的に間違っている部分を教えていただきたいです。


fid =fopen('e16A0319.282564','r');

%ヘッダー7行飛ばす
for i = 1:8
header = fgetl(fid);
end
% 各データセットの読み込み
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);


データフォーマットは「http://licel.com/raw_data_format.html」です。

以前にここで似たような質問をさせていただき、丁寧なご回答をいただいたのですが、解決できずにまた質問させていただきました。
お詳しい方よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

どのようなエラーかわかりませんが
data={:,i}
で大丈夫そうな予想

投稿2016/12/12 22:04

iwanote

総合スコア295

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

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

Tannnnnnnnnnn

2016/12/14 20:30

ご回答ありがとうございます。 data ={:,i} で実行しましたが、下記のエラーが出ました。 エラー fgets ファイルの識別子が無効です。有効なファイルの識別子を生成するには fopen を使用してください。 エラーの発生場所 fgetl (line 34) [tline,lt] = fgets(fid); エラーの発生場所 bynari (line 5) header = fgetl(fid); どのような対策が考えられるでしょうか。
iwanote

2016/12/14 20:34

プログラムはこれですべてですか?
Tannnnnnnnnnn

2016/12/14 20:43

はい、すべてです。 全体の構造は、 ーーーーーーーーーー 固定ヘッダ行1 固定ヘッダ行2 固定ヘッダ行3 データセットヘッダ行1 データセットヘッダ行2 データセットヘッダ行3 データセットヘッダ行4 データセット1 (512x4バイト) <CRLF> データセット2 (512x4バイト) <CRLF> データセット3 (512x4バイト) <CRLF> データセット4 (512x4バイト) ーーーーーーーーーーーーーーーーーーー になっています。 全てのデータが、データセット4、データ512×4バイト、 32ビットデータをリトルエンディアンの整数と仮定したコードです。
Tannnnnnnnnnn

2016/12/14 20:51

連続ですみません。 fid =fopen('e16A0319.282564','r');⇒fid =fopen('e16A0319.282564','w'); と変更したところ、エラーが消え、 e16A0319.282564 ファイルがMATLABに読み込めたのですが、 中身が空です。 これは正確に読み込めていないということでしょうか。
iwanote

2016/12/14 20:53

w指定だと中身は破棄されてしまいますよ r+だとどうです?
Tannnnnnnnnnn

2016/12/14 21:04

w指定だから空になってしまうのですね。 r+だと以下のエラーが出てしまいます。 エラー fgets ファイルの識別子が無効です。有効なファイルの識別子を生成するには fopen を使用してください。 エラーの発生場所 fgetl (line 34) [tline,lt] = fgets(fid); エラーの発生場所 bynari (line 5) header = fgetl(fid);
iwanote

2016/12/14 21:07

ファイル名とそのディレクトリは正しいですか? fidの数値を調べてみてください
Tannnnnnnnnnn

2016/12/14 21:24

ファイル名は正しいのですが、 fidの数値は-1でした。
Tannnnnnnnnnn

2016/12/14 21:24

-1は何を表しているのでしょうか。 無知で申し訳ありません。
iwanote

2016/12/14 21:25

ではファイルの位置がおかしいかもしれません もしくは拡張子が書いていないとか…?
iwanote

2016/12/14 21:25

-1は読み取れていないものです
Tannnnnnnnnnn

2016/12/14 21:40

ファイルの位置を間違えていました、再度fidの数値を確認したところ 3 でした。 観測データのファイル名が「e16A0319.282564」なので、拡張子がもともとありません。。
iwanote

2016/12/14 21:43

3なら正常に読み取れていると思いますがエラーは出ていますか?
Tannnnnnnnnnn

2016/12/14 21:46

お早い返信ありがとうございます。助かります。 プログラムは通りましたが、そのファイルを開くと下記の表示になり、下部分が変換されていないのですが、、プログラムに問題があるのでしょうか。。 ーーーーーーーーーーーーー e16A0319.282564 TMU 03/10/2016 19:27:24 03/10/2016 19:28:25 0000 0000.0 0000.0 00 0000000 0010 0018953 0010 04 1 0 2 00512 1 0000 0015 00829.o 0 0 00 000 12 150025 0.020 BT1 1 1 2 00512 1 0000 0015 00829.o 0 0 00 000 00 150025 3.1746 BC1 1 0 2 00512 1 0000 0015 00829.o 0 0 00 000 12 150025 0.020 BT1 1 1 2 00512 1 0000 0015 00829.o 0 0 00 000 00 150025 3.1746 BC1  h � S2 {4 � ゚ 糠 �ー�c�ク�4@ ロ�'�チ H 熬 シ) エチ b�ロH /ロ セ& ト; A () xF 広 tX 鉄 ミj w 芭 礼 ��ホ�7�ァ�:・ ー 嫉 鮃 セ |タ リネ ホ 﨓 =ル Kリ 8�晨 ン�w��ル 3 � Z エ  N! � ホ( / z: : 6D sH !L J ェU マV _ ” 0e (o  n u � ョ� ー�ヘ�逶 棗  コオ (ク ヘク jテ ネ � @ホ ウヤ Sワ ユ�杢 x�>�T�� ナ�ワ�瑪 H�?�S�纏K:"�r g'.M�セ�v�ve^゚ {゙ヒ+今|5・ルコ�@w�+�ス�Gヱキア チlコ1聾トヘ?�キハス-マヤフr(ラI"mナ m)モマ6@ヲ�cケ�;ハtl>クコg'Yn��WチXO ノ;k8モ�シ e6; `J ヒ*得<K �吋f7 A 9U 愰� Oミ 蕭キ�4�t � y�7xt�チ�[�佐 ~�K�F�ノ五  # h_  �� オ,U)ト n ウz  � u ノケ トテ !  s「 lm 2+ 樟 'oメ 枚 4�m。 @+ y 季 オe ;フ ニ ヌ�� 赳 エa x 6�7�7=  J Wツ ・ワ エ Zホ チ- #: (m � pシ ヘ�ヘ ] Pュ �L~ ハk ュヒ oD 楓  + ィカ  4u サ S }4 ' Zフ �x ?�フ � ヘ [�G�c U Tv ルッ ォメ Bミ ォィ { Q a キs サ」 、キ 愀 n�ュq  ツ_ リ| ョ�擯 ォ 囿 ト�「i 考 從 2�n」 ヘュ ?ョ ?� � 縒 <�?�箙 德 ムウ 
Tannnnnnnnnnn

2016/12/14 21:50

ちなみに最初の質問文と今実行したファイルは別物です。。
iwanote

2016/12/14 22:14

CRLF読み飛ばしのfreadの第二引数は2だと思います あとは…もしかしたらdata{i, :}かもしれないです…
Tannnnnnnnnnn

2016/12/15 18:33

ご回答ありがとうございます。 freadの第二引数2でも結果は変わらず、 date{i,:}ではエラーになりました...。
iwanote

2016/12/16 02:48

こちらでも確認してみましたが data = cell(1, 4); for i = 1:4 data{:,i} = fread(fid, 512, 'long'); こちらでdata配列に数値が入っているのを確認しました。 正常なデータがどのようなものかわからないため何とも言えませんが... ステップ実行をすれば内部データがわかるので確かめで見てはどうでしょうか?
Tannnnnnnnnnn

2016/12/18 19:53

ご回答ありがとうございます。 下記のプログラムを実行したところ、date配列の中身に数値が入っていました。 ーーーーーーーーーーーーーーーーーー fid =fopen('e16A0319.292710','r+'); for i = 1:8 header = fgetl(fid); end % 各データセットの読み込み data = cell(1, 4); for i = 1:4 data{:,i} = fread(fid, 512, 'long'); % <CRLF> の読み飛ばし if i ~= 4 fread(fid, 2, 'short'); end end celldisp(data) fclose(fid); ーーーーーーーーーーーーーーーーーーーーーー いまいち理解仕切れていないのですが、 このdate配列に数値が入っているということは、 元の’e16A0319.292710’ファイルをテキストファイルに変換できたということでしょうか。
Tannnnnnnnnnn

2016/12/18 20:12

このプログラムを実行しても、’e16A0319.292710’ファイルの、’ h � S2 ・・・・’の部分は変わっていません。
Tannnnnnnnnnn

2016/12/18 20:12

このプログラムの正しい実行後、’e16A0319.292710’ファイルの、’ h � S2 ・・・・’の部分が数値に変わる。というそもそもの理解が間違っているのでしょうか。 分かりづらい質問で申し訳ございませんが、よろしくお願い致します。
iwanote

2016/12/19 04:34

ファイルへアクセスしている関数は今のところfgetlとfreadだけです。 この二つはファイルからの読み出しをしているだけです。 ファイルへの書き込みをするばあいはfprintfなどをする必要があります。
Tannnnnnnnnnn

2016/12/20 21:27

ご回答ありがとうございます。 最後に質問なのですが、 「e16A0319.272413」のファイルを、拡張子がtxtに変換して出力したいのですが、 どのような方法があるのでしょうか。 長々と質問した後に恐縮ですが、よろしくお願い致します。
iwanote

2016/12/20 22:22

fopen関数に作りたいファイル名を入力すればそのファイルが作られます。 a = fopen('b.txt','w'); このようにすればb.txtが作られ、a(fidと同じ種類の変数)にそのfileIDが渡されます 詳しくはfopenやfprintfなどのMATLABのドキュメンテーションを調べてみるといいかもです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問