【Java】CSVファイルを読み込み、結果をリストに格納する
CSVファイルを読み込み、結果をリストに格納する
今回使用した環境
インターネット接続可能のオンラインの環境
64 ビット オペレーティング システム
Windows 10 22H2
Java 17
読み込むCSVファイル
「bunbougu.csv」という文房具のCSVファイルで名前、金額、日付という項目を持っています。
名前,金額,日付
鉛筆,30,2023/8/9 12:10:08
消しゴム,120,2023/8/17 08:03:12
筆箱,680,2022/12/28 11:15:30
ソースコード
まずはCSVファイルの項目の名前、金額、日付を定義した「Bunbougu.java」のクラスです。
package javatest;
import java.math.BigDecimal;
import java.util.Date;
public class Bunbougu {
private String namae; // 名前
private BigDecimal kingaku; // 金額
private Date hiduke; // 日付
public String getNamae() {
return namae;
}
public void setNamae(String namae) {
this.namae = namae;
}
public BigDecimal getKingaku() {
return kingaku;
}
public void setKingaku(BigDecimal kingaku) {
this.kingaku = kingaku;
}
public Date getHiduke() {
return hiduke;
}
public void setHiduke(Date hiduke) {
this.hiduke = hiduke;
}
}
次に「CsvReader.java」です。
「bunbougu.csv」を読み込み、JAVAオブジェクトのリストに格納後、リストの内容をコンソール出力します。
package javatest;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class CsvReader {
public static void main(String[] args) {
try {
// CSVを読み込んだ結果を格納するリスト
ArrayList<Bunbougu> bunbouguList = new ArrayList<Bunbougu>();
// CSVファイルのパスを取得
Path path = Paths.get("C:\\bunbougu.csv");
// CSVファイルを全行読み込み
List<String> lineList = Files.readAllLines(path, StandardCharsets.UTF_8);
// CSV内の日付項目を変換するためのフォーマット
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// ヘッダの1行目を読みとばして最終行まで繰り返し
for (int i = 1; i < lineList.size(); i++) {
// 1行をカンマで分割
String[] line = lineList.get(i).split(",", -1);
// 項目ごとにオブジェクトへ格納
Bunbougu bunbougu = new Bunbougu();
bunbougu.setNamae(line[0]);
bunbougu.setKingaku(new BigDecimal(line[1]));
bunbougu.setHiduke(dateFormat.parse(line[2]));
bunbouguList.add(bunbougu);
}
// リストに格納したオブジェクトの内容を出力
for (Bunbougu bunbougu : bunbouguList) {
System.out.println(bunbougu.getNamae());
System.out.println(bunbougu.getKingaku());
System.out.println(dateFormat.format(bunbougu.getHiduke()));
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
※注:上記コードはCSVファイルに不正な値が入っていることは考慮していません。
※注:33行目の「String[] line = lineList.get(i).split(“,", -1);」
splitの「-1」を省略し、かつCSVに空欄の項目が含まれている場合、要素数が可変になってしまいます。
例えばCSVの1行が「ボールペン,,」となっていた場合、2個目以降の要素は無視され、要素数が1つとなります。
知らず知らずしてIndexOutOfBoundsExceptionの原因を作ってしまうことになっちゃいますね。
なのでCSVファイルの読み込みでは基本的に「-1」を入れておいたほうが無難だと思われます。
動作確認
動かしてみるとコンソールが以下のようになりました。JAVAオブジェクトのリストにCSVファイルの内容が格納されていることが確認できました。
以上となります。
ここまでお読みいただきありがとうございました。