
以下のCSVデータが存在します。
①カンマ区切り
②値はダブルクォーテーションで囲まれてる ③数字の場合、ダブルクォーテーションに囲まれていない場合もある
④値の中にカンマあり ※これに困ってます
現状としては、①②③の状態だけならカンマを元にsplitし、ダブルクォーテーションを空に置換すれば各項目の値を取得できますが、④が存在したことによって想定しない位置で区切られました。
現在は以下サイドを参考にしていますが、処理が複雑すぎる気がして、もっといい方法はないのでしょうか?
ご存じの方ご教示をお願いいたします。
https://qiita.com/takashi-fki/items/c7095ccb41fe …
No.5ベストアンサー
- 回答日時:
こんにちは
JAVAは存じませんので、考え方のみです。
元のCSVの複雑さにもよりますが、問題となるカンマを一旦カンマ以外に置き換えてからSplitし、その後元に戻すという方法です。
以下では、問題のカンマがある場合は、必ずダブルクォーテーション内であるものと想定しています。
>④値の中にカンマあり
の意味がはっきりしなかったので・・
上記の想定が間違っている場合は、以下は無視してください。
正規表現の文法も若干違うかもしれませんが・・
/[,^]".*?"[,$]/g
で、ダブルコーテーションに囲まれた文字列がヒットすると思います。
上記からコーテーションと区切りのカンマ部分を除いて、
/(?<=(^|,)")(.*?)(?="(,|$))/g
とすれば、通常のダブルクォーテーション内の文字列だけを取り出せるはずです。
(上記では、ダブルクォーテーション内にダブルクォーテーションがあって、さらにそれにカンマが連続しているようなケースは想定していませんので、その可能性がある場合は見直しが必要です)
手順としては、以下のような感じではいかがでしょうか?
1)replacementに関数が使えるのかどうかは存じませんが、上記で抜き出した文字列内のカンマを一旦代替文字列に置き換えます。
(代替文字列は通常使用しない文字列で。例えば、ESC c ESC とか)
2)Splitで分割
3)分割後の文字列の前後のダブルクォーテーションを(あれば)除き、代替文字列をカンマに戻す。
No.6
- 回答日時:
真面目に 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番目の引用符が閉じてないので、次項目と結合
No.3
- 回答日時:
このサンプルの様に1文字1文字調べて区切っていく方法しか思い付きません
いやシンプルなのでは?
私なら1文字1文字見てダブルクォートで囲われてないカンマを「|」に置き換えて|でsplitします
そっちの方が複雑かと思います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の変数(LSB)の合わせ込...
-
wsprintf関数の使い方について
-
ダブルクォーテーションを含む...
-
JavaScriptの変数の値が消える!?
-
直し方について教えて頂きたい...
-
JSPでの計算結果表示
-
【Excel VBA】繰り返し処理がで...
-
WinInet.dllを利用したHttpQuer...
-
BCD形式で時刻を!
-
任意の変数が任意の値になった...
-
VB6,論理演算子Orの使い方がわ...
-
指定した日付が何日前なのかを...
-
javaのCSVデータ読込についてです
-
-1.#IND00を検知する方法
-
DOSバッチで変数の値を変数名に...
-
Stringクラスの変数の格納アド...
-
【JavaScript】指定箇所に文字...
-
Javascriptでマシン固有の情報...
-
ArrayListの要素数の上限
-
PSQLExceptionが発生する
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ArrayListの要素数の上限
-
JSPでの計算結果表示
-
javaのCSVデータ読込についてです
-
JSPでHashMap・配列の変数の値...
-
DateTimePickerに値を入れたい...
-
ダブルクォーテーションを含む...
-
matchesを否定文として使う方法...
-
wsprintf関数の使い方について
-
Stringクラスの変数の格納アド...
-
ResultSetの内部構造(Java)
-
C言語の変数(LSB)の合わせ込...
-
excel vba 時間計算と条件分岐...
-
JavaScriptの変数の値が消える!?
-
String型の値が大文字か小文字...
-
Request.formの値の初期化
-
実行シェルからCOBOLへパラメー...
-
VB6,論理演算子Orの使い方がわ...
-
DOSバッチで変数の値を変数名に...
-
char型での演算子
-
日付や時刻の"01"を" 1"に変換...
おすすめ情報