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

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

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

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

Q&A

解決済

1回答

9090閲覧

JAVAにてCSVファイルの配列取得について

kumakumatan

総合スコア213

Java

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

0グッド

0クリップ

投稿2016/06/16 01:24

csvファイルのA列~D列まで値を入力しています。
1行づつ読み込んで、行ごとの配列数を表示させたく思います。
「1行目配列数4」
「2行目配列数4」
「3行目配列数4」
「4行目配列数5」
「5行目配列数4」



のように表示させたいのですが、下記のコードだとすべて、
「1行目配列数5」
「2行目配列数5」
「3行目配列数5」
「4行目配列数5」
「5行目配列数5」
と表示されてしまいます。4行目だけが配列数5なのですが、他の行も
配列数5と表示されてしまいます。
配列数を取得する箇所が間違っている気もするのですが、どこを修正して
いいか悩んでおります。

どうがご教授いただければと思います。

宜しくお願いします。

JAVA

1/** 2 * CSV配列数のチェック(A~D列以外はNG) 3 * @param args 4 */ 5 6package ren01; 7 8import java.io.BufferedReader; 9import java.io.File; 10import java.io.FileInputStream; 11import java.io.FileNotFoundException; 12import java.io.IOException; 13import java.io.InputStreamReader; 14import java.io.UnsupportedEncodingException; 15 16public class FieldChk02 { 17 //処理フラグ(0なら正常:1以上なら異常) 18 int flg = 0; 19 20 public static void main(String[] args) { 21 // クラス化 22 //public void method() { 23 // ここにコードを挿入 24 25 try { 26 27 //String path = new File(".").getAbsoluteFile().getParent(); 28 //System.out.println(path + "\\sample.csv"); 29 //String path2 = (path + "\\sample.csv"); 30 //System.out.println(path2); 31 32 // ファイルのパスを指定してオブジェクトを生成。 33 File file = new File("C:\\ws01\\ren01\\src\\ren01\\sample.csv"); 34 //File file = new File(path2); 35 36 // 入力ストリームを生成。( FileNotFoundException が発生 ) 37 FileInputStream input = new FileInputStream(file); 38 /* 入力ストリームの読み込み。 ( UnsupportedEncodingException が発生 ) 39 * ここでCSVファイルの文字コードを設定しないと文字化けします。 */ 40 // 読み込むファイルの文字コード(SJIS) 41 InputStreamReader stream = new InputStreamReader(input, "SJIS"); 42 // バッファに取り込み。 43 44 BufferedReader buffer = new BufferedReader(stream); 45 46 //変数定義 47 //読み込み行 48 String line; 49 //読み込み件数 50 int count = 0; 51 //配列数 52 int len1 = 0; 53 54 /* readLine()でバッファの1行を取り出す作業を、読み込める行が無くなるまでwhile文で実行。 55 * line = buffer.readline() でBufferedReaderが保持する一行を取出しているので、ループする毎に書き変わります。 */ 56 while((line = buffer.readLine()) != null) { 57 // 取出した1行の文字セットを変換して新たに文字列を生成。 58 byte[] b = line.getBytes(); 59 // String で UnsupportedEncodingException が発生 (変換したい文字コード:UTF-8) 60 line = new String(b, "UTF-8"); 61 // 文字列をカンマ区切りで配列に分けて要素ごとに出力。 62 // line.splitの第2引数に"-1"を指定しないと、他の行と要素数が 63 // 違うため、出力結果の様にはなりません。 64 String[] columns = line.split(",", -1); 65 66 // 読み込み行数カウント 67 count++; 68 //配列数定義 69 len1 = columns.length; 70 71 for(int j = 0; j < columns.length; j++) { 72 //for(int j = 0; j < 4; j++) { 73 //System.out.println(j + " : " + columns[j]); 74 } 75 //各行の配列数表示 76 System.out.println(count + "行目" + "配列数" + len1); 77 78 } 79 //配列数表示 80 //System.out.println(len1); 81 //処理フラグ確認 82 //System.out.println(flg); 83 //CSV読み込み行数 84 //System.out.println(count + "行読み込みました。"); 85 86 //配列数 87 //System.out.println("配列数" + len1); 88 89 // 開いたストリームとバッファを閉じて関連するシステム・リソースを解放します。 ( IOException が発生 ) 90 input.close(); 91 stream.close(); 92 buffer.close(); 93 94 } catch (UnsupportedEncodingException | FileNotFoundException e) { 95 e.printStackTrace(); 96 97 } catch (IOException e) { 98 e.printStackTrace(); 99 100 } 101 102 } 103 104}

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

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

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

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

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

coco_bauer

2016/06/16 02:07

配列数というのは、csvファイルの1行に含まれる項目の数(,の数+1)ですか? それとも、1行に書かれている項目(無いものは除く)の数ですか? "a,b,c,,"という行があった時、これの配列数は3か5かが知りたいです。
guest

回答1

0

ベストアンサー

CSVに誤りがあるのではないでしょうか。
CSVを追記してください。

投稿2016/06/16 01:33

yona

総合スコア18155

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

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

kumakumatan

2016/06/16 01:44

```CSVの内容 ABC123,テスト A,123456,060-5938-1234, ABC456,テスト B,1234567,060-7886-567, ABC789,テスト C,1234568,060-3981-8910, ABCD123,テスト D,123459,060-6487-8911, ABCD456,テスト E,1234589,060-4697-8912,テスト ABCD789,テスト F,1234581,060-4577-8913, ABCD12,テスト G,1234582,060-1266-8914, ABCD34,テスト H,12345834,060-7412-8915, ``` 宜しくお願いします。
yona

2016/06/16 01:57

splitの第二引数を0にしないといけないのではないですか?
nob.

2016/06/16 01:57

横から失礼します。 行の最後に ',' があるからではないですか? split()の仕様を確認して下さい
yona

2016/06/16 02:04

nobさんの指摘通りです。 ただ、何をするかによって第二引数の指定は変わります。 今回の場合-1を指定し、空白は要素が足りないのではなく、空文字が入っていると考えた方が良さそうです。
coco_bauer

2016/06/16 02:16 編集

区切りの文字","が1行に4つあるということは、その行の項目数は5です。だから、プログラムは正しい。空文字を除外するのなら、そのようにコードを修正する必要がありますね。
yona

2016/06/16 02:26

結局のところ、質問者のやりたいこと次第で第二引数を変更する必要がありますね。 CSVの形式を変更するのは影響範囲が広くなりがちなので。
kumakumatan

2016/06/16 02:52

ありがとうございます。 解決しました。 String[] columns = line.split(",", 0); でやりたい事ができました。
coco_bauer

2016/06/16 02:53

CSVデータの中で起こりうるバリエーションと、それに対する「配列数」が明らかにならないと、コードの検討は無理でしょうね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問