この記事で扱っていること
- 複数のファイルから抽出したヘッダの情報によってファイルを選択する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
データを保存したファイルの識別の方法はいくつかあり得ると思います。
ファイル名で識別するのは一つの方法だと思いますが、ファイル名に識別するためのすべての情報を載せると長くなってしまって不便かと思います。
そこで考えられるのが、ファイル内に用意したヘッダ情報です。
ヘッダには多くの場合、そのファイルがどういうファイルなのかを説明した情報が載っていることがあるので、その情報から目的のファイルを探し出すことで効率よく検索することが可能です。
便宜上、これらのファイルの識別を行うためのヘッダの中の情報をプロパティと呼びます。
例えばヘッダに「責任者」が「織田信長」と書かれている場合、「責任者」はプロパティ名、「織田信長」はプロパティ値、となります。
LabVIEWではTDMSというファイル形式の場合プロパティの設定、読み取りが関数一つで行えますが、これは拡張子tdmsのファイルに対してしか行えません。
より一般的なファイル形式でどのようにするかについて例を考えてみました。
実際のヘッダ情報の並び方はファイルの種類によると思うので、あくまである特定の並び方をしている場合の方法とはなりますが、大まかな方法は参考にして頂けると思います。
どんな結果になるか
本記事で検索対象とするファイルは、下の図のようなヘッダ情報を持っています。
最初の3行にヘッダ情報があって、1列目にプロパティ名、2列目にプロパティ値があります。そして4行目以降になにかしらのデータが並んでいる、という状態です。
プロパティの個数はこの通りである必要はありません(4つ以上のプロパティがあっても問題ありません)、重要なのは1列目と2列目の情報だけです。
プログラムのフロントパネルとしては下の図のようにしました。プロパティの数の部分だけは正確に入力する必要があります。
なお、「プロパティ名選択」はリング制御器、「プロパティリスト」はリストボックスを使用しています。
共通のプロパティを持つ複数のファイルが一つのフォルダに入っており、そのフォルダを選択することでプロパティ名を読み取ってリストで選べるようにし、選んだプロパティ名に対してさらにプロパティ値をリスト、リスト項目を選択すればそのファイルの名前とファイル内のデータを表示させるようにしています。
プログラムの構造
プログラムの作りは、まずフォルダ内のファイルすべてをいったん読みにいってプロパティ名とプロパティ値を抽出して、それから選択されたプロパティ値に応じてデータを表示させるようにしています。
まず初めにプロパティをリストするためのリストボックスなどを初期化しています。その後に、データファイルが入ったフォルダを選択させるためにファイルダイアログExpress VIを使用しています。(ここで選ぶフォルダには、データファイル以外は入っていないことを想定しています)
フォルダが選ばれたら、フォルダをリストの関数で中身のファイル名を配列として取得し、これをForループの自動指標付けで渡しています。
Forループの中でプロパティ名の抽出をサブVIで行っており、中身はこのような形としています。
プロパティ名の抽出が終わったら、あとはユーザーが選択したプロパティ値に応じて再び目的のファイルを開くためのWhileループに入っていきます。
なお、Forループの中でケースストラクチャがひとつありますが、このFALSEケースは特に何もしておらず、左から右へエラーワイヤを渡しているだけです。毎回プロパティ名選択の文字列と値プロパティを実行する必要はないと思いこのようにしていますが、ケースストラクチャ自体なくても特に問題ありません。
ファイルの読み取りの部分に関してはイベントストラクチャを使用してなるべく効率が良くなるようにしています。
イベントとして登録しているのはユーザが操作しうる項目、つまりプロパティ名をリストボックスから選択する、プロパティ値をリストから選択する、そして終了ボタンを押すという3つのイベントです。
この記事では読み取り方に主眼を置いているので、読み取ったデータはただただ配列に表示させているだけです。もちろん、この読み取ったデータをグラフに表示する、あるいは解析の関数に渡す、などは適宜実装できます。
なお、イベントストラクチャの中身はなるべくコードを少なくシンプルにしたいということであればキューなど用いて別ループで具体的な処理を行い、イベントストラクチャはイベント検知のみを行うようにするのがより良いコードかもしれませんが、便宜上今回は全てイベントストラクチャの中にコードを書いてみました。
本記事で扱ったヘッダ情報を持つファイルの作成
もし、データ保存形式に特にこだわりはなく、本記事で読み取り対象として扱ったファイルのようなヘッダ情報を持つファイルを作るので構わない、という方に向けて、一応ファイル保存のプログラムもご紹介します。
あくまでサンプルとして素早く作りたかったので上位ファイル関数を使用しており、ファイル保存の効率(早さなど)は無視していますのでご注意ください。
csv以外の形式のファイルの場合
冒頭にも書きましたが、あくまでこの記事では特定の並びでヘッダ情報が載っている場合に対してのプログラムとなっています。
もしヘッダ情報の並びが異なっている場合には上で紹介したプログラムをそのまま扱うことはできません(参考にして頂ける部分はあるかもしれませんが)。
でももし例えばcsvではなくてタブ区切りのテキストファイルで今回扱ったようなヘッダ情報の並びのファイルがある場合には、以下のように2か所プログラムを変更するだけで対応できます。
この変更を施すだけで、以下のような実行結果を得られます。
LabVIEWでデータを保存することは簡単にできても、これを管理する必要があるということを忘れていると、せっかく用意したファイルも十分に活かしきれません。
そのため、後でしっかりファイルの識別ができるようにヘッダ情報を載せておくのはとても重要なことだと思います。
そしてそれと同じくらい、ヘッダ情報を元にファイルを検索するという仕組みも重要です。本記事はあくまでその一例ですが、参考にしていただけたら嬉しいです。
ここまで読んでいただきありがとうございました。
コメント