部分的にファイルを読み取る簡易ファイルビューア

Tips

スポンサーリンク

この記事で扱っていること

  • LabVIEWで部分的にファイルを読むファイルビューアを作成する方法

を紹介しています。

注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。

LabVIEWのファイルIOの関数では、ライン読み取りのモードにすることで、大量の行があるファイルも指定した行数だけ読み取ることができます。

そのため、本来はそれぞれのアプリ(テキストファイルならメモ帳、csvならExcelなど)で開くのに時間がかかるようなファイルでも、限定的に読み取ることでファイルの中身を素早く確認することができます。

今回はフロントパネル上でフォルダを参照、そのフォルダ内のファイルをダブルクリックすることで指定した行数だけファイルを読み込んで表示させるビューアを作ってみました。

スポンサーリンク

どんな結果になるか

フロントパネルには、対象とするフォルダを変更するボタン、そのフォルダの上の階層へ移動するためのボタン、フォルダの中身を表示させるリストボックスがあります。

リストボックス上に表示されたファイルをクリックすると、もしそれがファイルならファイル情報が表示され、ダブルクリックするとそのファイルの中身を指定した行数および指定したデリミタで区切って表示します。(デリミタが適切ではないと正しく読み取られません)

一方でリストボックスでクリックしたものがフォルダならディレクトリですというメッセージが出て、これをダブルクリックするとそのフォルダの中身に移ります。

ファイルをダブルクリックすると、その中身を表示するのですが、この表示行数はフロントパネルの「何行読む?」で指定した行数となります。

実際にそのファイルを他のアプリケーション(Excel)で開いたときと当然同じ中身が表示されます。

もし行数が実際のファイルよりも多くなっている場合には、読み取り自体は全て行うのですが警告メッセージを出します。

プログラムの構造

イベント駆動型のステートマシンを使用しています。

ステートの数は6個で、イベントの種類は5つあります。

それぞれのステートの中身を見ていきます。

まず、初期化であるinitializeのステートと終了であるcloseのステート、これらは特別なことはしていません。ただし、このプログラムはまずフォルダを指定しないと何も始まらないことから、初期化のinitialステートでファイルダイアログExpress VIにてフォルダを選択するようにさせています。

次にイベントを待つidleステートです。このステートは、initializeとclose以外のステートが実行されると戻ってくる基点となるステートで、それぞれのステートで変更されうるファイルパスの指定を反映して、常に最新のリストボックスの状態を表示させるようにしています。

次はfile_checkのステートです。このステートは、リストボックスの値変更イベントにより実行されるステートで、リストボックスで指定された項目の番号数を指標配列に渡してファイルを特定、そのファイルの情報を調べて、ファイルなのか、ショートカットなのか、フォルダ(ディレクトリ)なのかで表示するメッセージを変えるようにしています。

次は上の階層に移るlevel_upステートです。これは単純で、パスをストリップ関数でファイルパスを一つ上の階層に変更しているだけです。

最後はopenfileステートです。リストボックスの中身をダブルクリックすることでこのステートに移ります。file_checkのステートと似たようなことをしてから、もしファイルが選択されていた場合にはサブVIであるfile_view.viにてファイルを読み取ります。

このサブVIはVIプロパティのウィンドウの外観カテゴリのカスタマイズで

  • 呼び出されたらフロントパネルを表示
  • 元々閉じていたら実行後に閉じる

としています。こうすることで、このサブVIをファイルビューアとして機能させます。

コネクタペーン上には、メインVIから受け取る区切り文字選択の列挙体やファイルパスの制御器がありますが、これらはフロントパネルのウィンドウの幅を変えることで隠しています。

ブロックダイアグラムの中身は単純で、ファイルIOの関数を使って、読み取ったデータを複数列リストボックスに表示させています。

読み取りの関数にはライン読み取りの設定(テキストファイルから読み取るの関数を右クリックしてライン読み取りを選択)を行い、これを指定した数だけForループで回すようにしています。そして読み込んだデータはスプレッドシート文字列を配列に変換関数で適切なデータ形式として読み込んだデータ(複数列リストボックス)の項目名プロパティに渡しています。

注意する必要があるのは、読み込んだファイルの中身の最終行の状態によってはファイルを全部読み込めない可能性があることです。それを防ぐため、右上の方で少しエラー処理をしています。

ただし、ファイル読み取りに関しては様々なエラーが出る可能性が考えられるため、エラー4(ファイルの終端まで読み取りを終えたというエラー)以外のエラーもメインVIの方で確認できるようにしてみました。そのためメインVIにはエラー表示器をつけてファイルIOに関するエラーの確認ができます。

デリミタで区切られていないファイルも読み取る場合

上で紹介したサンプルは、デリミタの指定を行うことで、タブ、スペース、カンマなどの区切り文字があるファイルに対して適用できます。

一方で、ファイルとしては特にデリミタなどない場合もあるかと思います。そんな場合にはfile_view.viを少し改造して単に文字列表示器にファイルの中身を表示させるというプログラムにすることで対応できます。例えば以下のような形にプログラムを改造すればいけます。

メインVIの区切り文字選択の列挙体で「デリミタなし」などといった選択肢を作り、これが選ばれた場合には文字列表示器に表示させるサブVIを実行させるという実装が考えられると思います。

ファイルビューアをわざわざLabVIEWで作る必要はないのかもしれませんが、決めた行数だけ読み取るのは、サイズの大きさなファイルを開くよりも便利ですので何かの役にたてばうれしいです。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました