【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ファイルの内容が格納されていることが確認できました。

以上となります。

ここまでお読みいただきありがとうございました。

Java

Posted by だゆう