質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

11194閲覧

java+CSV ダブルクォーテーションで囲われた文字列の操作について

niboshi39

総合スコア6

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/07/02 11:41

前提・実現したいこと

ダブルクォーテーションで囲われた文字列中にある改行コードを 別の文字に置換したい。

<背景>
JAVAでCSVを読込んで加工する処理を組んでいます。
現場の事情によりOpenCsvなどの便利なAPIが利用できず
作りこむ必要がでてきました。

該当のソースコード

<inputfileの中身> taro,"aaa bbb" <code> // メイン処理 各ファイルを開いて処理を開始 try (BufferedReader readFile = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile)));) { // 1行づつ読込んで処理 while ((readLine = readFile.readLine()) != null) { // readLineに1行を読込んだ時 taro,"aaa しか取れていない // ここをtaro,"aaa\r\n bbb" のような形で読込みたい。

試したこと

OpenCsvのコードをDownloadして、取り込もうとしたのですが
コード量が多くなってしまうため、断念しました。

補足情報(FW/ツールのバージョンなど)

Javaバッチの前後でコマンドなどで何か処理を行うなどでも
良い方法はないでしょうか。ご教授いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

簡易に行途中の改行を検知して次行と合わせたい場合は、読み込んだ行に出現するダブルクォートが奇数か偶数かで判定できると思います。
(奇数だったら継続です)

java

1 Scanner sc = new Scanner(System.in); 2 3 while(sc.hasNext()){ 4 String line = ""; 5 do{ 6 line += sc.nextLine(); // lineにどんどん連結していく(サンプルなので簡易的な方法) 7 }while(Main.countDQuot(line) % 2 != 0); // line中のダブルクォートが偶数だったらループ終了 8 //この後、カンマごとに分割する処理 9 }

java

1 // ダブルクォートの数を数える。 2 public static int countDQuot(String line){ 3 // 文字列内のダブルクォートを削除した別Stringを用意し 4 String l2 = line.replace("\"",""); 5 // lengthの差を求めればダブルクォートの数が分かる 6 return line.length() - l2.length(); 7 }

カンマ分割処理をちゃんとCSVのフォーマットに則った方法で行うのはなかなか難しいと思いますが、頑張ってください。

投稿2021/07/02 15:55

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niboshi39

2021/07/05 13:00

ありがとうございます。 たしかに!と思い可能か以下のコードで確認してみたところ、 long count = readLine.chars().filter(ch -> ch == '"').count(); System.out.println("ダブルクォートの数 " + count); 思ったより改行の個数と登場するダブルクォートの数が複雑で 断念しました。可能性を一つ潰せて助かりました。
guest

0

ベストアンサー

Java

1import java.io.*; 2 3class Main { 4 public static void main (String[] args) { 5 try (BufferedReader br = new BufferedReader(new FileReader("infile.txt"))) { 6 StringBuilder sb = new StringBuilder(); 7 boolean notString = true; 8 int c; 9 while ((c = br.read()) != -1) { 10 if (c == '\n' && notString) { 11 String s = sb.toString().replaceAll("\n", "\\n"); 12 System.out.println(s); 13 sb.delete(0, sb.length()); 14 } 15 else { 16 if (c == '"') notString = !notString; 17 sb.append((char)c); 18 } 19 } 20 } 21 catch (IOException e) { 22 e.printStackTrace(); 23 } 24 } 25}

infile.txt

text

1taro,"aaa 2 bbb" 3jiro,"ccc ddd" eee 4sabro,"fff 5 ggg 6 hhh iii"

実行結果

text

1taro,"aaa\n bbb" 2jiro,"ccc ddd" eee 3sabro,"fff\n ggg\n hhh iii"

これでいいのかどうかをコメントしてください。
全部理解できたら解決にしてください。

投稿2021/07/02 13:14

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niboshi39

2021/07/05 13:00

これをやりたかったです。ありがとうございます。 理解するのに時間がかかり、回答遅くなりました。 助かりました。
guest

0

読み込んだ、readLine に継続行があるか判断して、必要に応じて連結してはどうでしょうか。

java

1while ((readLine = readFile.readLine()) != null) { 2 while(xxxx(readLine)) { // 継続行があるか判定 3 readLine += "\n" + readFile.readLine(); 4 } 5 // キレイなreadLineが出来ている

判断方法は、エスケープされていないダブルクォートを数えるとか?
要件に合わせればよいかと思います。

投稿2021/07/02 12:03

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niboshi39

2021/07/05 13:00

ご丁寧にありがとうございます。 お陰様で短い時間で確認することができました。 最初の回答の方と同様に試させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問