ここでは Java 7 以降で使える try-with-resources を使った、安全にファイルを読み書きするバージョンを作ります。
これにより、finally で手動で close する必要がなくなり、例外発生時でも自動でリソースが閉じられます。
やること(CSV 特定列抽出版)
input.csvをBufferedReaderで読み込む,で分割して ArrayList<String[]> に格納- 指定した列だけ抜き出す
PrintWriterでoutput.csvに書き出す
完成コード(try-with-resources 版)
import java.util.*;
import java.io.*;
public class CSVColumnExtractSafe {
public static void main(String[] args) {
// 抜き出したい列番号(0-indexed)
int[] columnsToExtract = {0, 2}; // 名前, 国
// try-with-resources で BufferedReader と PrintWriter を同時に管理
try (
BufferedReader br = new BufferedReader(new FileReader("input.csv"));
PrintWriter pw = new PrintWriter(new FileWriter("output.csv"))
) {
ArrayList<String[]> rows = new ArrayList<>();
String line;
// ファイル読み込み
while ((line = br.readLine()) != null) {
String[] cols = line.split(",");
rows.add(cols);
}
// 特定列を抜き出して書き込み
for (String[] row : rows) {
List<String> selectedCols = new ArrayList<>();
for (int colIndex : columnsToExtract) {
if (colIndex < row.length) {
selectedCols.add(row[colIndex]);
} else {
selectedCols.add(""); // 列がない場合は空文字
}
}
pw.println(String.join(",", selectedCols));
}
System.out.println("特定列の抽出が完了しました! output.csv を確認してください。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Javaポイント解説
try-with-resources の特徴
try (
BufferedReader br = new BufferedReader(new FileReader("input.csv"));
PrintWriter pw = new PrintWriter(new FileWriter("output.csv"))
) {
...
}
Javabrとpwは ブロック終了時に自動で close される- 例外発生時でもリソースリークが起きない
finallyで手動で閉じる必要がなくなる
CSV 特定列抽出の流れ
- 行ごとに
split(",")で分割 - 抜き出したい列番号をループで選択
String.join(",", selectedCols)で結合- PrintWriter で一行ずつ書き込み
出力例(output.csv)
入力ファイル:
名前,年齢,国
Tom,25,USA
Hanako,30,Japan
Yuki,22,Japan
Sara,28,UK
指定列 {0, 2} で出力:
名前,国
Tom,USA
Hanako,Japan
Yuki,Japan
Sara,UK
応用ポイント
- 列番号を配列で指定 することで、抜き出す列を簡単に変更可能
- 条件付き抽出 も組み込める
if (row[2].equals("Japan")) { ... } - ファイル読み書きのエラー(FileNotFoundException, IOException)も catch で一括管理
💡 このバージョンは 安全かつ簡潔 にファイル操作ができるので、現場でもよく使われます。
