以下の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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- オープンソース csvデータのダブルクォーテーションで囲まれた文字内にあるカンマを削除したい 3 2022/09/02 15:17
- Visual Basic(VBA) VBAで出力したCSVファイルの先頭にカンマを挿入したい 5 2022/10/14 12:20
- Excel(エクセル) エクセル シート内のボックスを縦並びから横並びに 7 2023/04/05 04:28
- Excel(エクセル) エクセルの散布図で新たに入力した値のデータラベルが空欄になる現象 1 2022/04/26 09:31
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Visual Basic(VBA) 【VBA】特定の文字で改行(次の行)に行きたい。 3 2022/04/11 17:20
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- システム メールのcsv添付ファイルの種類を テキスト形式からカンマ区切り形式に 変更する方法はありますか? 4 2023/03/09 20:33
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
文字列からダブルクオートの削除
Java
-
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
ダブルクォーテーションを含む正規表現について。
Java
-
-
4
カンマ区切りのCSVファイルから"を削除したい
その他(プログラミング・Web制作)
-
5
csvデータのダブルクォーテーションで囲まれた文字内にあるカンマを削除したい
オープンソース
-
6
ダブルクォーテーションのreplaceの方法
JavaScript
-
7
、(ダブルクォーテーション)で囲まれている文字列を正規表現で取得"
PHP
-
8
ServletからServletへの値渡し
Java
-
9
Javaの質問です。テキストファイルを読み込み、配列にデータを格納する。
Java
-
10
コマンドプロンプトのエラーについて
その他(パソコン・周辺機器)
-
11
【正規表現に詳しい方】ダブルクォーテーションで囲まれたCSVを作る方法Part2
その他(ソフトウェア)
-
12
[JAVA]try 内の変数を外で!?
Java
-
13
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
14
カンマ区切りの数字をCSVファイルにインポートする時どうすれば?
Excel(エクセル)
-
15
jspでbeanを使いたいのですが...
Java
-
16
テーブルの一部分のセルだけにスクロールバーを付けたいのですが、うまくいきません。
HTML・CSS
-
17
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
18
CSVファイルの、列だけ取得したい
Java
-
19
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
20
System.out.printlnの出力先
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPでの計算結果表示
-
ダブルクォーテーションを含む...
-
ArrayListの要素数の上限
-
偶数ビットだけと奇数ビットだ...
-
JSPでHashMap・配列の変数の値...
-
PSQLExceptionが発生する
-
HTTPリクエストのリダイレクトU...
-
テキストボックスの数値チェック
-
wsprintf関数の使い方について
-
BCD形式で時刻を!
-
UINT64→UINT32[2]にする方法
-
結合した文字列をファイル名に...
-
javaのCSVデータ読込についてです
-
excel vba 時間計算と条件分岐...
-
(Javaで)第1コマンドライン...
-
DateTimePickerに値を入れたい...
-
CASLIIの問題なんですが
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
パソコンキーボードで時分秒を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
wsprintf関数の使い方について
-
ArrayListの要素数の上限
-
BCD形式で時刻を!
-
javaのCSVデータ読込についてです
-
DateTimePickerに値を入れたい...
-
C言語の変数(LSB)の合わせ込...
-
JSPでHashMap・配列の変数の値...
-
matchesを否定文として使う方法...
-
JSPでの計算結果表示
-
hiddenの値を消したくない!
-
結合した文字列をファイル名に...
-
excel vba 時間計算と条件分岐...
-
実行シェルからCOBOLへパラメー...
-
long型に値を代入したい。
-
【Excel VBA】繰り返し処理がで...
-
Stringクラスの変数の格納アド...
-
PSQLExceptionが発生する
-
ResultSetの内部構造(Java)
-
String str = "a\\\\b\\\\c";
おすすめ情報