プロが教える店舗&オフィスのセキュリティ対策術

以下のCSVデータが存在します。
①カンマ区切り
②値はダブルクォーテーションで囲まれてる ③数字の場合、ダブルクォーテーションに囲まれていない場合もある
④値の中にカンマあり ※これに困ってます

現状としては、①②③の状態だけならカンマを元にsplitし、ダブルクォーテーションを空に置換すれば各項目の値を取得できますが、④が存在したことによって想定しない位置で区切られました。

現在は以下サイドを参考にしていますが、処理が複雑すぎる気がして、もっといい方法はないのでしょうか?
ご存じの方ご教示をお願いいたします。

https://qiita.com/takashi-fki/items/c7095ccb41fe …

A 回答 (6件)

こんにちは



JAVAは存じませんので、考え方のみです。

元のCSVの複雑さにもよりますが、問題となるカンマを一旦カンマ以外に置き換えてからSplitし、その後元に戻すという方法です。
以下では、問題のカンマがある場合は、必ずダブルクォーテーション内であるものと想定しています。

>④値の中にカンマあり
の意味がはっきりしなかったので・・
上記の想定が間違っている場合は、以下は無視してください。


正規表現の文法も若干違うかもしれませんが・・
 /[,^]".*?"[,$]/g
で、ダブルコーテーションに囲まれた文字列がヒットすると思います。
上記からコーテーションと区切りのカンマ部分を除いて、
 /(?<=(^|,)")(.*?)(?="(,|$))/g
とすれば、通常のダブルクォーテーション内の文字列だけを取り出せるはずです。
(上記では、ダブルクォーテーション内にダブルクォーテーションがあって、さらにそれにカンマが連続しているようなケースは想定していませんので、その可能性がある場合は見直しが必要です)

手順としては、以下のような感じではいかがでしょうか?
1)replacementに関数が使えるのかどうかは存じませんが、上記で抜き出した文字列内のカンマを一旦代替文字列に置き換えます。
(代替文字列は通常使用しない文字列で。例えば、ESC c ESC とか)

2)Splitで分割

3)分割後の文字列の前後のダブルクォーテーションを(あれば)除き、代替文字列をカンマに戻す。
    • good
    • 1

真面目に CSV を読み込むならば、RFC4180 に対応した構文解析が必須です。


https://www.ietf.org/rfc/rfc4180.txt

簡単に実装できるものでもないので、専用ライブラリをご利用ください。
https://mvnrepository.com/artifact/org.apache.co …

自前で行うのであれば、ご提示のサイトを見習って構文解析をしましょう。
Java 標準ライブラリにあるトークン処理機能を利用すればもう少し簡単に書けるかと思います。
https://docs.oracle.com/javase/jp/16/docs/api/ja …

構文解析ではなく、もっと簡単に処理しても問題ないのであれば、以下で方針で設計しては如何でしょうか。

案1. 問題部分を置換して、分割してから復元
例)
ab,"cd,ef",gh
ab,"cd@ef",gh ← 引用内のカンマだけを仮字に置換
ab | "cd@ef" | gh ← カンマで分割
ab | "cd,ef" | gh ← 仮字からカンマに復元

案2. 単純に分割し、必要があれば結合
例)
ab,"cd,ef",gh
ab | "cd | ef" | gh ← カンマで分割
ab | "cd,ef" | gh ← 2番目の引用符が閉じてないので、次項目と結合
    • good
    • 0

こちらの方法はいかがでしょうか。


https://qa.oshiete.goo.ne.jp/qa/view/8063097
    • good
    • 0

このサンプルの様に1文字1文字調べて区切っていく方法しか思い付きません



いやシンプルなのでは?
私なら1文字1文字見てダブルクォートで囲われてないカンマを「|」に置き換えて|でsplitします
そっちの方が複雑かと思います
    • good
    • 0

区切り文字をカンマ以外にするために、一度excelとかで読み込んで、TAB区切りtextとかのformatで保存するとか、が簡単ではある。

    • good
    • 1

>>ダブルクォーテーションを空に置換


この逆にしたらどうでしょうか?

全てダブルクォーテーションで囲む。

そうすれば、値の中のカンマはデータとして扱われます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています