JAVAにてCSVファイルの配列取得について
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 4,869
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と表示されてしまいます。
配列数を取得する箇所が間違っている気もするのですが、どこを修正して
いいか悩んでおります。
どうがご教授いただければと思います。
宜しくお願いします。
/**
* CSV配列数のチェック(A~D列以外はNG)
* @param args
*/
package ren01;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
public class FieldChk02 {
//処理フラグ(0なら正常:1以上なら異常)
int flg = 0;
public static void main(String[] args) {
// クラス化
//public void method() {
// ここにコードを挿入
try {
//String path = new File(".").getAbsoluteFile().getParent();
//System.out.println(path + "\\sample.csv");
//String path2 = (path + "\\sample.csv");
//System.out.println(path2);
// ファイルのパスを指定してオブジェクトを生成。
File file = new File("C:\\ws01\\ren01\\src\\ren01\\sample.csv");
//File file = new File(path2);
// 入力ストリームを生成。( FileNotFoundException が発生 )
FileInputStream input = new FileInputStream(file);
/* 入力ストリームの読み込み。 ( UnsupportedEncodingException が発生 )
* ここでCSVファイルの文字コードを設定しないと文字化けします。 */
// 読み込むファイルの文字コード(SJIS)
InputStreamReader stream = new InputStreamReader(input, "SJIS");
// バッファに取り込み。
BufferedReader buffer = new BufferedReader(stream);
//変数定義
//読み込み行
String line;
//読み込み件数
int count = 0;
//配列数
int len1 = 0;
/* readLine()でバッファの1行を取り出す作業を、読み込める行が無くなるまでwhile文で実行。
* line = buffer.readline() でBufferedReaderが保持する一行を取出しているので、ループする毎に書き変わります。 */
while((line = buffer.readLine()) != null) {
// 取出した1行の文字セットを変換して新たに文字列を生成。
byte[] b = line.getBytes();
// String で UnsupportedEncodingException が発生 (変換したい文字コード:UTF-8)
line = new String(b, "UTF-8");
// 文字列をカンマ区切りで配列に分けて要素ごとに出力。
// line.splitの第2引数に"-1"を指定しないと、他の行と要素数が
// 違うため、出力結果の様にはなりません。
String[] columns = line.split(",", -1);
// 読み込み行数カウント
count++;
//配列数定義
len1 = columns.length;
for(int j = 0; j < columns.length; j++) {
//for(int j = 0; j < 4; j++) {
//System.out.println(j + " : " + columns[j]);
}
//各行の配列数表示
System.out.println(count + "行目" + "配列数" + len1);
}
//配列数表示
//System.out.println(len1);
//処理フラグ確認
//System.out.println(flg);
//CSV読み込み行数
//System.out.println(count + "行読み込みました。");
//配列数
//System.out.println("配列数" + len1);
// 開いたストリームとバッファを閉じて関連するシステム・リソースを解放します。 ( IOException が発生 )
input.close();
stream.close();
buffer.close();
} catch (UnsupportedEncodingException | FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
coco_bauer
2016/06/16 11:07
配列数というのは、csvファイルの1行に含まれる項目の数(,の数+1)ですか? それとも、1行に書かれている項目(無いものは除く)の数ですか? "a,b,c,,"という行があった時、これの配列数は3か5かが知りたいです。
masaya_ohashi
2016/06/16 11:19
5です