念のため
カラム数は10くらいあって、それを1つ1つ改行があるか検証して、あったら配列へ…ってやるのは現実的じゃない
改行の有無を検証すること自体が、そもそも不可能です。
改行毎に1行を読みこむので、その1行には改行コードは、ありません。
YakumoSakiさんの回答にある通り
質問者さんのコードだと readLine()
でCSVを読み込んでいるので、誰にも負けない
までが1行
複数行読みこんでもカラムが足りない場合、結果的に改行されていると判断するしかありません。
また、そのカラムがどこ?っていうのを記録しておかない限りは、data[2]なのかdata[3]なのかも判断できません。
カンマとダブルクォートで、どの位置を判定しているかを記録しつつ・・・
と、本格的にやるなら、こんな対応(Java:CSVパーサを作る)が必要
ですが、本格的にやるなら、そもそも自前で書かずにcsvのライブラリ使った方がよいです。
簡易版は、コメントでも書きましたが、splitして規定のlengthにならないなら
次の行を読み込んで、連結後、splitをしてlengthの確認を繰り返す感じです。
java
1String s = "氏名,社員ID,自己PR,人材,5,6,7,8,9,10\n" +
2 "飯田次郎,1000,\"誰にも負けない\r" +
3 "心強さがあります。\",ああああ,5,6,7,8,9,10\n" +
4 "山田花子,1001,\"あああああああ\",ああああ,5,6,7,8,9,10\n" +
5 "テスト,1002,\"あ\r" +
6 "い\r" +
7 "う\",かきくけ,5,6,7,8,9,10\n" +
8 "桃太郎,1003,\"おこし\r" +
9 "煮つけ\r" +
10 "焚き火\r" +
11 "団子\",\"一つ\r" +
12 "わたし肉\r" +
13 "ださいな\",5,6,7,8,9,10";
14
15BufferedReader buf = new BufferedReader(new StringReader(s));
16buf.readLine(); // ヘッダーは読み飛ばし
17String line;
18String tmp = "";
19int rowCnt = 0;
20int recCnt = 0;
21while ((line = buf.readLine()) != null) {
22 rowCnt++;
23 tmp = (tmp.length() == 0) ? line : tmp + "\n" + line; // 既存の分と連結
24 String[] data = tmp.split(",", -1);
25
26 // System.out.println(line);
27 if (data.length < 10) {
28 // 次の行を読む
29 } else {
30 recCnt++;
31 // CSV 1レコードが、そろった場合の処理
32 System.out.println(data[0] + ":" + data[1]);
33 System.out.println(data[2]);
34 System.out.println(data[3]);
35 System.out.println("----");
36 tmp = ""; // 1レコード処理が終わったら、tmpをクリアする
37 }
38}
39System.out.println("csvレコード数 " + recCnt);
40System.out.println("改行数 " + rowCnt);
41
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/18 23:48