カンマがセルに入ったcsvファイルを読み書きする

Tips

スポンサーリンク

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

  • カンマがセルに入ったcsvファイルを読み書きする方法

を紹介しています。

LabVIEWではいくつかのファイル形式へのデータ保存およびデータの読み取りをサポートしていますが、広く使われているファイル形式の一つがcsvかと思います。

その名の通り、カンマで区切られたデータ(Comma Separated Value)を保存したファイルですが、様々な理由があり「セルの中に区切り文字としてではないカンマが使用されている」ケースがあります。

こういったファイルをExcelで開くとき、区切り文字ではないカンマを許容して表示できるのですが、同じような表示をLabVIEWでも行う方法について紹介しています。

また、csvファイルに書き込む場合の例も記事後半で紹介しています。

スポンサーリンク

どんな結果になるか

いくつかのパターンのcsvファイルに対して、試してみます。

記事後半で紹介する、ある程度汎用的な処理もあるにはあるのですが、いくつかの対処方法を持っておくと様々な場面に対応しやすくなります。

まずは、座標情報のような、括弧で囲まれた中に数字とカンマが使われている場合です。

次は、一部のセルについて、英字が括弧の前にあって括弧の中にカンマが使用されているパターンです。

英字が括弧の前にあることが本質、というよりは、括弧の中に複数のカンマがある、というところが最初の例と異なるところです。

最後は、括弧など使用されておらず、桁を3つごとに区切る目的でカンマが使用されている場合です。

これらについて、それぞれどのような処理で「うまく」表現していくかを紹介していきます。

プログラムの構造

カンマがセルに入ったcsvファイルというのは、「区切られたスプレッドシートから読み取る」の関数を使っても、そのままであれば「区切り文字(デリミタ)としてのカンマ」と、「セルの中で特定の意味を持つカンマ」は区別されません。

そのため、まずはファイルの中身を全部(あるいは一行ずつ)読み取ってから後処理的な形で「区切り文字としてのカンマか否か」を識別する必要があります。

例えば座標を表すようなファイルを扱う場合、座標を表す括弧の後ろ側に区切り文字としてのカンマがあるので合って、括弧の前側と後ろ側に挟まれたカンマは区切り文字として扱わないようにします。

以下の図では、Whileループの中で、「括弧の後ろにあるカンマ」(正確には、括弧の後にダブルクォーテーションがついているので、「括弧とダブルクォーテーションの後ろにあるカンマ」)を「括弧(とダブルクォーテーション)とタブ定数」に置換し、タブ定数をデリミタ(区切り文字)として配列に変換するという処理を行っています。

こうすることで、配列要素はカンマを基準にではなくタブ定数を基準に作られることになるためうまく処理することができます。

また、最後のForループは、ダブルクォーテーションを取り除くための処理です。

ちなみに、一行ずつ読み取るのは、テキストファイルから読み取るの関数の設定で行えます。

この関数のエラー出力をWhileループの条件端子に入力すれば、ファイルから読み取る行がなくなったら関数からエラーが出るのでこのエラーを利用してWhileループを終了させる、ということができます。

次の、英字と括弧が続く例でも同じように処理ができる場合はあるのですが、括弧の中に複数のカンマが含まれている場合だと、「括弧が閉じられるまでに入っているカンマは区切り文字とみなさない」という処理に変える必要があります。

今度は、敢えて区切られたスプレッドシートから読み取るの関数を使用して実装した場合の例を紹介します。

Forループを使用することで一行ずつの処理に分けて、各行にある配列要素を一つずつ(列ごとに)確認し、指定した区切りはじめと区切り終わりの間の中身を同じ文字列にするといった処理を行っています。

この方法では、正規表現での区切りはじめと終わりのパターンを変えれば、他の文字列が使用された場合であっても処理ができます。

例えば以下は、「括弧の前に何らかの英字がある」場合ですが、区切りはじめの指定を変えれば同じプログラムで期待する結果を得ることができています。

最後に、桁数の区切りとしてカンマが使用されている場合ですが、これは「カンマが入っているセルにはダブルクォーテーションがつく」ことを利用して処理しています。

ダブルクォーテーションに挟まれた部分にあるカンマを一旦別の文字(以下の例では「|」)に置換してカンマ区切りで配列に変換、最後に別の文字として指定した文字をカンマに置換しなおすという処理をしています。

万能な方法

上で紹介した各パターンのプログラム、特に最後の例を見て、「あれ、セルの中にカンマがある場合、そのセルの文字は常にダブルクォーテーションで区切られているのでは?」と思った方もいると思います。

実は、ダブルクォーテーションが含まれていないセルしかないファイルについては、上記のパターンすべては以下の一つのプログラムで全て対応することができます。

ただしこのプログラムはあくまで「セルの中にダブルクォーテーションがない場合」にのみ有効で、セルの中にダブルクォーテーションがあるとそのままでは使えないので注意が必要です。

もしセルの中にダブルクォーテーションがある場合には少し工夫が必要です。

例えば、正規表現で、ダブルクォーテーションが使用されている場所をピンポイントで指定するような処理をする必要があります。

カンマがセルに入ったcsvファイルを作る方法

上ではカンマが入ったcsvファイルを読み取る方法を紹介しましたが、今度は、カンマが入ったセルを持つデータをcsvファイルに書き込む方法を考えてみます。

もうお気づきの方も多いかもしれないですが、こちらについては、ダブルクォーテーションで囲うことで対応することができます。

カンマが入ったセル(2次元配列の要素)があれば、そのセルの中身の文字列の前後にダブルクォーテーションを付与するような処理を設ければよく、例えば以下のように実装できます。

本記事では、カンマがセルに入ったcsvファイルを読み取る方法を紹介しました。

本来はcsvファイルにカンマを使用したファイルは好ましくないですが、何らかの事情があってカンマを使用する必要がある場合について、「工夫」することでうまく読み取れるように組む際に参考になればうれしいです。

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

コメント

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