NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

LabViewでバイナリファイルをcsvに変換する方法

解決済み
解決策を見る

LabViewでバイナリファイルをcsvに変換する方法を探しています。

0 件の賞賛
メッセージ1/7
2,212件の閲覧回数

tdakさん、はじめまして。

 

こちらのバイナリファイルは、中身がどのようなフォーマットで作成されているかは把握されていますでしょうか。

基本的には、

1. バイナリファイルを読み込む

2. フォーマットを参照して、バイナリファイルを変換する

3. 変換したデータをカンマ区切りの文字列にするか、文字列の配列にする

4. それをCSVとして書き出す

という流れです。

 

ただ、フォーマットがわからないと、文字列に戻せないと思いますので、まずはそちらからかと思います。

0 件の賞賛
メッセージ2/7
2,200件の閲覧回数

ke525 様

 

素人のため大雑把な質問で大変失礼いたしました。

おそらく、日付がフォーマットになっていると思います。

 

前任の者から添付したブロック線図のプログラムを引き継いだのですが、なぜかうまく作動しません。

具体的には、バイナリファイルの全データを変換できずにいます。

Highlight Executionの状態でプログラムを実行するとフロントパネルから実行するよりはるかに多くのデータをcsvファイルに変換することができました。

0 件の賞賛
メッセージ3/7
2,162件の閲覧回数

tdakさん、こんにちは。

 

まず現状ですが、

・バイナリデータをDoubleの2次元配列で変換しながら読み込んでいます。

なので、もし内容が浮動小数点でない(日付フォーマットのデータ)のであれば、この時点で数字が意味ないものになってしまうと思います。

VIとファイルを共有いただければ、少し試すことはできると思います。

 

・Highlightでデータ数が増える現象について

これはキューの利用が関わっています。上のループの右側でキューを削除していると思います。

下のループでデキューでデータを取っているところが実行される前にキューが削除されると、下のループからデータが出てこなくなります。

なので、Highlightでゆっくり実行すると、キュー削除が呼ばれる時間を遅らせられるので、その間にデータが取得できているのかと思います。

キューの中身が0になるまでキューを削除しないように作ると良いと思います。

 

方法としては、上のループとキュー削除の間にもう一つWhileループを入れます。

新しいループの中で、キューステータス取得を使い、キュー数のデータが0になったらループが止まるように作ります。

 

一度試していただきうまくいかないようであればサンプルみたいなものを作れると思います。もしくはVIを共有いただけるのであればそちらに少しコメントとか入れつつ実装サンプルも入れられると思います。

0 件の賞賛
メッセージ4/7
2,155件の閲覧回数

ke525 様

 

フォーマットですが、確かではありません。バイナリファイルが1Gbを超えるため共有できないのですが、フォーマットを確認する方法がございましたら、教えていただきたいです。おそらく、私がわかっていないだけで、このプログラムは正しいフォーマットに対して組まれていると思いますので問題ないと思います。

 

VIを共有させていただきます。

0 件の賞賛
メッセージ5/7
2,146件の閲覧回数
解決策
受理者 tdak

tdakさん

 

今のVIが正しいとすると、以前に書いたように2次元の浮動小数点のデータということになります。

バイナリファイルのフォーマットは作った人しか基本わかりませんので。。

一部はCSV変換できているのであれば、そのデータがカンマ区切りの数値になっているかどうかで確認できると思います。

 

ファイルは1GB以上とのことですが、Wordpadなどで開いて、後半部分をガッツリ削除して小さくすれば共有できるかと思います。

中途半端なデータになってしまってても途中までは読み込めると思います。

 

キューを削除しないように変更しましたので、一度試してみてください。

0 件の賞賛
メッセージ6/7
2,110件の閲覧回数

tdakさん

 

追記です。

今回のバイナリファイルを作成しているVIもしくはプログラムがあるのであれば、そちらを見ることでフォーマットがわかると思います。

ご参考まで。

0 件の賞賛
メッセージ7/7
2,100件の閲覧回数