CSV にクラスタを保存
5月 9, 2012 コメントを残す
計測したときのパラメータとその時の結果などを一緒にクラスタに格納して、ファイルに保存したいと思います。
設定を変更したパラメータに対して、対になる形で結果も保存できて、さらにエクセルなどで開けるのであれは結構いいですよね。
xml での保存、読み出しは、結構楽で、「XMLに平坦化」→「XMLファイルに書き込み」などで勝手に解釈してくれます。
でも、xml だと他の人に渡しても後で処理したいときに難しいです。
そこで、わかりやすいところで、CSV形式のファイルで保存できるか試してみました。
関数を探してみる
ということで、LabVIEWヘルプ のキーワード で「CSV」を検索すると、
なぜか MathScript RT モジュールのヘルプが出てきました。
検索の方で「CSV」を検索すると、
それなりに出てきました。
でも、パッと思いつく、ファイルIO パレットにある「スプレッドシートに書き込む」は出てきませんね。
そちらのヘルプを見ると、「デリミタとして , (カンマ)云々..」と書いてあり、CSV という記述はありません。だから検索でも見つけられないのですね。
とりあえず、今回は「スプレッドシートに書き込む」関数を使ってみたいと思います。
まずは、LabVIEW ヘルプの「スプレッドシートに書き込む」関数を読んでおきます。
インスタンス(多態性)なので、データタイプによって倍精度、文字列、整数が選べるようですが動作的には一緒のようです。
基本的には、2Dデータの方を使うようです。
1Dデータを使う場合には、呼び出される毎に行が追加されていきます。
ということは、今回のように次々に追加していく場合には使えるかもしれませんね。
で、サンプルを見てみようと、ヘルプの下の方にある「サンプルを開く」で開いてみました。
開いたサンプルは「EMail with Data VI」
使用されているのは「データ」が「ASCII」の時で「送信」が押された時のようです。
そのままデフオルトで実行するとエラーしますが。
とはいえ、ファイルパスと、波形の1D 配列が書き込めてはいました。デフォルトの「タブ区切り」で。
では実際に作ってみます。
実際に試してみる
現実になるべく則して考えたいと思います。
まず、対になるパラメータのクラスタと結果のクラスタが、1つのクラスタに格納されているとします。
それが、配列で複数あり、さらにクラスタ化されているとします。
このような感じ。
今回、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 |
: |
: |
: |
: |
: |
: |
まずは、クラスタの中身を配列に変換します。と、「クラスタから配列に変換」というのがあります。
が、単純なクラスタじゃないとダメみたいです。
上記のようなクラスでは接続できませんでした。
ま、一旦自分でクラスタを平たくする必要はありそうですね。
ということで、「名前をバンドル解除」を使って一度ばらします。
ここで、問題が。今はすべて同じ型ですので、まとめて配列にできますが、もし異なる型が混じっている場合にはどうするか?
まず、確実なのは文字列化してしまうことでしょうか。
面倒ですが、必要なものだけでもよいかもしれません。
そしたら、その文字列を連結して 1D の配列にします。
そして、「スプレッドシートに書き込み」の 1D の入力に入れてあげます。
あとは、ファイルパスを指定して、ファイルに追加、デリミタを指定します。
では、先程のテーブルをもう一度確認してみます。
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 ループのインデックスを文字列化して追加します。
で、続いてファイルの最初だけヘッダを追加するようにしてみます。
べたに書くとすればフラットシーケンスストラクチャですね。
では、クラスタに先程のテーブルの値を入れて、パスを指定して実行してみます。
本来は、何かプログラム実行時にこのクラスタを作ってあげるのですが、テストですので初期値として手入力しておきます。
実行してみます。指定したパスに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 |
: |
: |
: |
: |
: |
: |
ちゃんと、思った通りにできています。
クラスタを保存するにはクラスタを「タイプ定義制御器」としておいて、
まとめ
独自のクラスタをCSV で保存するには。
①ばらす
②それぞれ文字列化し文字列の1次元配列にする
③「スプレッドシートに書き込む」で「ファイルに追加」を "T"、「デリミタ」 に "," に指定する。
という方法がべたですが良いかなと。