JavaでのCSVファイル読み込み方法とは?

- システム
エンジニア - CSVファイル読み込み方法ってどんな方法なのですか?
- プロジェクト
マネージャー - カンマで区切られたファイルをJavaプログラムを使って読み込む方法です。
CSVファイルとは?
エクセルのデータを他のアプリケーションで利用する場合には、CSV形式で一旦データを保存してから読み込むことが多いのではないでしょうか。
CSVとはcomma-separated valuesの略で、カンマで区切られたデータ形式です。CSVファイルはテキストファイルのため扱いやすく、アプリケーションに依存しないデータ形式として、よく使われます。
CSVファイルは、複数のレコードから成り立ちます。レコード内のフィールドはカンマで区切られ、レコード間は改行で区切られます。1行が1レコードなので、エクセルなどの表と親和性の高い形式です。
CSVファイルのデータ例
CSVのデータ例を示します。下に示す例は、科目毎の点数を記録する表をCSV形式に変換したものです。
1行目は表のヘッダで、各列の属性を表しています。2行目以降は、各人のデータを表しています。行内のデータの区切りがカンマ「,」となっているのがわかります。
1
2
3
4
5
6
|
番号,名前,国語,数学,英語
1,田中,100,70,60
2,鈴木,90,80,60
3,佐藤,75,85,70
4,竹内,80,75,80
5,村田,90,90,70
|
CSVを1レコードずつ読み込む方法
以下では、CSVファイルのデータをJavaプログラムで処理するために、データを読み込む方法を説明していきます。
最初に、CSVファイルを読み込み、画面に出力するJavaプログラムについて説明します。
行毎に読み込みカンマで分割
CSVデータは1行が1レコードなので、行毎の読み込みが適しています。読み込みには、JavaのBufferdReaderクラスのテキスト行を読み込むメソッドreadLineを利用します。
readLineで読み込んだ1行分の文字列(line)を分割するには、splitメソッドを利用します。引数にカンマを指定することで、lineをカンマで分割した結果がString配列の形式で返却されます。
行読み込みのコード例
CSVデータを1行ずつ読み込むJavaプログラムの例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import java.io.*;
public class ReadCSV01 {
// CSVファイルを読み込み1行ずつ出力
public static void main(String[] args) {
BufferedReader br = null;
String file_name = "csvdata.txt"; // 入力ファイル
try {
File file = new File(file_name);
br = new BufferedReader(new FileReader(file));
// readLineで一行ずつ読み込む
String line; // 読み込み行
String[] data; // 分割後のデータを保持する配列
while ((line = br.readLine()) != null) {
// lineをカンマで分割し、配列dataに設定
data = line.split(",");
// 1行分の読み込みデータを表示(データ間にスペース)
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
System.out.println();
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
br.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
|
出力結果
1行読み込んだら、1行分のデータを出力します。このコード例では、データ間にスペースを挿入しています。CSVファイルの例で示したデータを入力ファイルに設定し実行すると、次のように出力されました。
1
2
3
4
5
6
7
8
9
|
$java ReadCSV01
番号 名前 国語 数学 英語
1 田中 100 70 60
2 鈴木 90 80 60
3 佐藤 75 85 70
4 竹内 80 75 80
5 村田 90 90 70
|
CSVを2次元配列に読み込む方法
上のプログラムでは1レコードずつ処理を行いましたが、データ全体を処理したい場合には、読み込みデータの蓄積が必要です。ここでは、2次元配列にデータを格納するJavaプログラムの例を示します。
2次元配列にデータを格納する
2次元配列の宣言では、データの行数を決める必要があります。しかし、正確な行数はデータを読み込まないとわからないことも多いでしょう。そこで、想定行数の最大値MAX_DATA_NUMSを、配列の行数に設定します。
1行読み込んでString配列に格納するのは前のプログラムと同じですが、今回は、data[index]のように行をインデックスとする2次元配列に格納することにします。
読み込みデータの処理例として、画面への出力処理を追加します。2次元配列を2重ループで辿りますが、配列の行数は最大値で確保しているため、実際のデータ数に合わせて処理を終了する必要があります。そこで、data[i]がnullになったらループを中断します。
2次元配列のコード例
2次元配列にCSVファイルデータを読み込むJavaプログラムのコード例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import java.io.*;
public class ReadCSV02 {
// CSVファイルを2次元配列に読み込み
public static void main(String[] args) {
BufferedReader br = null;
String file_name = "csvdata.txt"; // 入力ファイル
// データの最大個数
final int MAX_DATA_NUMS = 100;
// データを格納する2次元配列
String[][] data = new String[MAX_DATA_NUMS][];
try {
File file = new File(file_name);
br = new BufferedReader(new FileReader(file));
// readLineで一行ずつ読み込む
int index = 0;
String line;
while ((line = br.readLine()) != null) {
// lineをカンマで分割し、配列dataに保持
data[index] = line.split(",");
index++;
}
// catch-finally部分は同様なので省略
}
// 配列に格納したデータを表示(データ間にスペース)
for (int i = 0; i < MAX_DATA_NUMS; i++) {
// データがなくなったら終了
if (data[i] == null) break;
for (int j = 0; j < data[i].length; j++) {
System.out.print(data[i][j] + " ");
}
System.out.println();
}
}
}
|
CSVをArrayListに読み込む方法
上の2次元配列のコード例では、行数の最大値を定数で指定しましたが、最大値が不明な場合には、JavaのArrayListを使う方法があります。
ここでは、要素がString配列型のArrayListを使い、CSVファイルを読み込むJavaプログラムの例を示します。splitで返却されるString配列を、addメソッドでリストに追加していきます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import java.io.*;
import java.util.*;
public class ReadCSV03 {
// CSVファイルをArrayListに読み込み
public static void main(String[] args) {
BufferedReader br = null;
String file_name = "csvdata.txt"; // 入力ファイル
// データを格納するリスト
List<String[]> data = new ArrayList<String[]>();
try {
File file = new File(file_name);
br = new BufferedReader(new FileReader(file));
// readLineで一行ずつ読み込む
String line;
while ((line = br.readLine()) != null) {
// lineをカンマで分割し、配列リストdataに追加
data.add(line.split(","));
}
// catch-finally部分は同様なので省略
}
// リストに格納したデータを表示(データ間にスペース)
for (String[] line_data : data) {
// 各行データを要素毎に処理
for (int i = 0; i < line_data.length; i++) {
System.out.print(line_data[i] + " ");
}
System.out.println();
}
}
}
|
- システム
エンジニア - 読み込み方法にも種類があるのですね。
- プロジェクト
マネージャー - 使いやすい読み込み方法を習得し、CSVファイルを作成していきましょう。
JavaのCSVファイル読み込み方法を理解しよう
カンマ区切りのデータ形式CSVファイルを、Javaプログラムで読み込む方法を紹介しました。1行毎に読み込む方法、2次元配列に格納する方法、ArrayListに格納する方法の3つの場合について、Javaプログラムの例を用いて説明しました。
実際にエクセルなどの表形式データを用いて、CSVファイルを作成し読み込みながら、どの方法が役に立つか考えてみてはいかがでしょうか。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)