CSV にクラスタを保存

計測したときのパラメータとその時の結果などを一緒にクラスタに格納して、ファイルに保存したいと思います。

設定を変更したパラメータに対して、対になる形で結果も保存できて、さらにエクセルなどで開けるのであれは結構いいですよね。

xml での保存、読み出しは、結構楽で、「XMLに平坦化」→「XMLファイルに書き込み」などで勝手に解釈してくれます。

でも、xml だと他の人に渡しても後で処理したいときに難しいです。

そこで、わかりやすいところで、CSV形式のファイルで保存できるか試してみました。

関数を探してみる

ということで、LabVIEWヘルプ のキーワード で「CSV」を検索すると、

clip_image001

なぜか MathScript RT モジュールのヘルプが出てきました。

検索の方で「CSV」を検索すると、

clip_image002

それなりに出てきました。

でも、パッと思いつく、ファイルIO パレットにある「スプレッドシートに書き込む」は出てきませんね。

そちらのヘルプを見ると、「デリミタとして , (カンマ)云々..」と書いてあり、CSV という記述はありません。だから検索でも見つけられないのですね。

とりあえず、今回は「スプレッドシートに書き込む」関数を使ってみたいと思います。

まずは、LabVIEW ヘルプの「スプレッドシートに書き込む」関数を読んでおきます。

インスタンス(多態性)なので、データタイプによって倍精度、文字列、整数が選べるようですが動作的には一緒のようです。

clip_image003

基本的には、2Dデータの方を使うようです。

1Dデータを使う場合には、呼び出される毎に行が追加されていきます。

ということは、今回のように次々に追加していく場合には使えるかもしれませんね。

で、サンプルを見てみようと、ヘルプの下の方にある「サンプルを開く」で開いてみました。

clip_image004

開いたサンプルは「EMail with Data VI」

clip_image005

使用されているのは「データ」が「ASCII」の時で「送信」が押された時のようです。

clip_image006

そのままデフオルトで実行するとエラーしますが。

とはいえ、ファイルパスと、波形の1D 配列が書き込めてはいました。デフォルトの「タブ区切り」で。

では実際に作ってみます。

実際に試してみる

現実になるべく則して考えたいと思います。

まず、対になるパラメータのクラスタと結果のクラスタが、1つのクラスタに格納されているとします。

それが、配列で複数あり、さらにクラスタ化されているとします。

clip_image007

このような感じ。

今回、Parameter A, C はある値に固定され、Parameter B のみ変化させた時の結果 Result A,B を保存します。

保存したい CSV形式は以下のようなイメージです。

INDEX

Parameter A

Parameter B

Parameter C

Result A

Result B

0

123

0

456

1

2

1

123

1

456

2

3

2

123

2

456

3

4

:

:

:

:

:

:

まずは、クラスタの中身を配列に変換します。と、「クラスタから配列に変換」というのがあります。

clip_image008

が、単純なクラスタじゃないとダメみたいです。

上記のようなクラスでは接続できませんでした。

clip_image009

ま、一旦自分でクラスタを平たくする必要はありそうですね。

ということで、「名前をバンドル解除」を使って一度ばらします。

clip_image010

ここで、問題が。今はすべて同じ型ですので、まとめて配列にできますが、もし異なる型が混じっている場合にはどうするか?

まず、確実なのは文字列化してしまうことでしょうか。

面倒ですが、必要なものだけでもよいかもしれません。

clip_image011

そしたら、その文字列を連結して 1D の配列にします。

そして、「スプレッドシートに書き込み」の 1D の入力に入れてあげます。

clip_image012

あとは、ファイルパスを指定して、ファイルに追加、デリミタを指定します。

clip_image013

では、先程のテーブルをもう一度確認してみます。

INDEX

Parameter A

Parameter B

Parameter C

Result A

Result B

0

123

0

456

1

2

1

123

1

456

2

3

2

123

2

456

3

4

:

:

:

:

:

:

インデックスも追加したいですよね。

あと、テーブルのヘッダも追加したいです。

インデックスだけまず追加してみます。

配列連結の先頭を伸ばして、For ループのインデックスを文字列化して追加します。

clip_image014

で、続いてファイルの最初だけヘッダを追加するようにしてみます。

べたに書くとすればフラットシーケンスストラクチャですね。

clip_image015

では、クラスタに先程のテーブルの値を入れて、パスを指定して実行してみます。

本来は、何かプログラム実行時にこのクラスタを作ってあげるのですが、テストですので初期値として手入力しておきます。

clip_image016

実行してみます。指定したパスにcsvファイルができています。

clip_image017

では、エクセルで開いてみましょう。

clip_image018

先程の想定していたテーブルはこちら。

INDEX

Parameter A

Parameter B

Parameter C

Result A

Result B

0

123

0

456

1

2

1

123

1

456

2

3

2

123

2

456

3

4

:

:

:

:

:

:

ちゃんと、思った通りにできています。

クラスタを保存するにはクラスタを「タイプ定義制御器」としておいて、

まとめ

独自のクラスタをCSV で保存するには。

①ばらす

②それぞれ文字列化し文字列の1次元配列にする

③「スプレッドシートに書き込む」で「ファイルに追加」を "T"、「デリミタ」 に "," に指定する。

という方法がべたですが良いかなと。

紹介 dolphinsasohの開発奮闘記
株式会社ドルフィンシステムで、デジタル信号処理、FPGA開発などを主に行ってます。 LabVIEW、FPGA、信号処理などその他いろいろ開発でのことを書き綴っていきたいと思います。

コメントを残す