NI製品ディスカッション

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

CSVファイルで空白や文字を除外して読みこむ方法ありますか?

CSVファイルをLabVIEW上(EXPRESS表)に読み込み、数字のみそのままの配列状態で表示
させたいのですが、下記の問題があり、難しいです。
 ①列間で行数が異なる
 ②間に文字や空白がある(普通に読むと0表示されるが、0表示させたくない)
 
行抜き取りで数字のみ抜き取ったりすると間がつまり、うまくいきません。
 
そのままに位置で読み込みたいのです。
 
読み込んだデータはその後、ヒストグラム作成などで使用したいと思ってます。
 
データのSAMPLE添付しますので、アドバイスよろしくお願いします。
エクセルで添付しますので、CSVに変換して使用してもらえればと思います。
 
以上
 
 
0 件の賞賛
メッセージ1/8
12,339件の閲覧回数
「表」ということは、文字列2次元配列ということで良いでしょうか?
添付の例では如何でしょうか。
 
csvは、16行ごとに、その16行内での最大列数に合わせてカンマが
つきますので、行ごとに列数が変わることがあります。
 
しかし、添付のように組んだところ、例示されたcsvのような場合でも、
最大行数、最大列数のところでちゃんと配列に組み込まれます。
 
文字列のまま扱うので、空欄のセルも含め、
csvの中に書かれたとおりになります。
 
メッセージ2/8
12,335件の閲覧回数

自己レスですが、先程の添付はLabVIEW6で、使用した関数は

Read Characters From File.vi

Match Pattern

Empty String/Path?

の3つです。念のため・・・

「Read Spreadsheet....」とかを使うと、一度数値化されてしまうので、

今回の例のような場合は普通に文字で読んだ方が良いかなと思いまして。

メッセージ3/8
12,333件の閲覧回数

アドバイス頂き、ありがとうございます。

参考になりました。

最終的には、表のデータを列毎に取り出し、ヒストグラム等の統計処理に使用することを

考えています。

ですので、最終的には列毎に数値データとして扱う必要があります。

一番上の行(A,B,C,D,E)は各列の項目名のイメージですので、その下の行(2行目)から

が実際に取り扱う必要のあるデータということになります。

(空白及び数値以外の文字もこの時点で除外する必要があります)

ここで処理方法について悩んでました。

ややこしい質問ですが、もし例などあれば、参考にさせて頂きたく考えております。

よろしくお願いします。

0 件の賞賛
メッセージ4/8
12,303件の閲覧回数
そうしますと、先日のviに追加すると、このような感じでしょうか。
面倒なのは、元のセルが数字だったか文字列もしくは空白だったか
ということですが、数字か文字列かというのは人間的な主観的要素が
多分にありますので、あくまで簡易判定として絵のような風にしてみますと
如何でしょうか。
 
表の中から特定の列を抜き出し、先頭行は項目名として除外し、
残りのセルから、数字として有効なものだけを選び出して配列に出力しています。
絵では、列に「2」を指定していますが、これは、列指標2、つまりcsvの「C列」を
取り出したことに相当します。
 
また、簡易判定では、数字に変換できるものを数字として有効にしています。
数字の前後に文字列が付加されているような場合は除外しています。
(数字の前の空白は許容されますが、数字の後ろの空白はNGになります)
グローバルな判定ではありませんが、概ね判断できそうです。
もっと賢い判定ルーチンもあるのではないかと思いますが。。。
 
あと、前回のviに追加した形で書いたのでこうなりましたが、実際は
csvを読み込んでいる最中に判定をして数値配列に持ち込むと
もう少し簡単になるでしょうか・・・
 
メッセージ5/8
12,299件の閲覧回数

素早いアドバイスありがとうございます。

LabVIEWを始めてまだ2ヶ月程度で、不慣れなことが多く、このようなページで疑問を相談させて頂くことが

でき、ありがたいと思っております。

ご提示頂いたサンプルですが、所望していたイメージとほぼ合致します。

ありがとうございます。

重ね重ねの質問になり、大変恐縮なのですが、表自体も数字以外を除去した形で表示させるような

サンプルなどありますでしょうか?

質問ばかりで恐縮なので、教えて頂いたPRGを参考に自分でもやってみようとは思っておりますが、

もし簡単に追加編集してできるレベルであれば勉強させて頂きたく思っております。

以上

0 件の賞賛
メッセージ6/8
12,278件の閲覧回数

(あまり良いサンプルではありませんが)先日のviに対し、今回の添付の絵のように、表を生成する段階で数値セルか文字列セルかどうかの判定をしてしまえば良いと思います。文字列セル(空のセルを含む)と判断されたセルには空の文字列をセットすることで、表にする時点で数値のセルだけ残すことができます。(この例では項目名までも空欄になりますが)

本例では、その表から数値データを生成しています。2次元数値配列だと、列ごとに行数が異なる配列は作れませんが、列の1次元配列をクラスタにいれ、それをさらに配列にすることで、列ごとに行数が異なる状態のまま全体を1つのデータにすることができます。ここから特定の列の数値データを取り出したいときは、IndexArrayで所定の列を取り出してから、Unbundleでクラスタから外すと、希望の列が1次元数値配列で得られます。

(本例は、数値か文字列かの判定と実際に数値化するところで2回ScanFromStringを使っていて無駄があるので、本人的にはあまり好きな組み方ではありませんが・・・一応、ご参考下さい)

メッセージ7/8
12,241件の閲覧回数
お返事が遅れ、大変申し訳ありません。
サンプルPRG大変参考になります。
クラスターをうまく利用するのも一つの方法なのですね。
他の案件でも色々と参考にさせて頂こうと考えております。
今回のような用途は結構あるような気がするのですが、関数として用意されてないものですね。
今後のバージョンアップでこのような例の関数がどんどん追加されていくことに期待したいと思ってます。
 
アドバイス頂き、ありがとうございました。
 
以上
0 件の賞賛
メッセージ8/8
12,170件の閲覧回数