JavaでのCSVファイル読み込み方法とは?
- SE
- CSVファイル読み込み方法ってどんな方法なのですか?
- PM
- カンマで区切られたファイルをJavaプログラムを使って読み込む方法です。
目次
CSVファイルとは?
エクセルのデータを他のアプリケーションで利用する場合には、CSV形式で一旦データを保存してから読み込むことが多いのではないでしょうか。
CSVとはcomma-separated valuesの略で、カンマで区切られたデータ形式です。CSVファイルはテキストファイルのため扱いやすく、アプリケーションに依存しないデータ形式として、よく使われます。
CSVファイルは、複数のレコードから成り立ちます。レコード内のフィールドはカンマで区切られ、レコード間は改行で区切られます。1行が1レコードなので、エクセルなどの表と親和性の高い形式です。
CSVファイルのデータ例
CSVのデータ例を示します。下に示す例は、科目毎の点数を記録する表をCSV形式に変換したものです。
1行目は表のヘッダで、各列の属性を表しています。2行目以降は、各人のデータを表しています。行内のデータの区切りがカンマ「,」となっているのがわかります。
番号,名前,国語,数学,英語
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
35
36
37
38
39
40
|
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
37
38
39
40
41
42
43
44
45
46
|
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
33
34
35
36
37
38
39
40
41
42
|
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();
}
}
}
|
- SE
- 読み込み方法にも種類があるのですね。
- PM
- 使いやすい読み込み方法を習得し、CSVファイルを作成していきましょう。
JavaのCSVファイル読み込み方法を理解しよう
カンマ区切りのデータ形式CSVファイルを、Javaプログラムで読み込む方法を紹介しました。1行毎に読み込む方法、2次元配列に格納する方法、ArrayListに格納する方法の3つの場合について、Javaプログラムの例を用いて説明しました。
実際にエクセルなどの表形式データを用いて、CSVファイルを作成し読み込みながら、どの方法が役に立つか考えてみてはいかがでしょうか。