ここでは CSV ファイルから特定の列だけ抜き出して別ファイルに書き出す Java 例を、初心者向けに丁寧に説明します。
ArrayList と subList は列単位の操作には直接使えませんが、行ごとの ArrayList<String[]> を作って列だけ抜き出す形で実現します。
やること
input.csvを読み込む,(カンマ)で分割して ArrayList<String[]> に格納- 抜き出したい列番号を指定して、別のリストに追加
output.csvに書き出す
入力ファイル例(input.csv)
名前,年齢,国
Tom,25,USA
Hanako,30,Japan
Yuki,22,Japan
Sara,28,UK
今回の例では 「名前」と「国」 だけ抜き出して書き出します。
完成コード
import java.util.*;
import java.io.*;
public class CSVColumnExtract {
public static void main(String[] args) {
BufferedReader br = null;
PrintWriter pw = null;
try {
br = new BufferedReader(new FileReader("input.csv"));
ArrayList<String[]> rows = new ArrayList<>();
String line;
while ((line = br.readLine()) != null) {
String[] cols = line.split(","); // カンマで分割
rows.add(cols);
}
// 抜き出したい列番号(0-indexed)例:名前=0, 国=2
int[] columnsToExtract = {0, 2};
// 書き込み用リスト
ArrayList<String> outLines = new ArrayList<>();
for (String[] row : rows) {
List<String> selectedCols = new ArrayList<>();
for (int colIndex : columnsToExtract) {
if (colIndex < row.length) {
selectedCols.add(row[colIndex]);
} else {
selectedCols.add(""); // 列がない場合は空文字
}
}
// カンマで結合して一行に
outLines.add(String.join(",", selectedCols));
}
// output.csv に書き出し
pw = new PrintWriter(new FileWriter("output.csv"));
for (String s : outLines) {
pw.println(s);
}
System.out.println("特定列の抽出が完了しました!");
System.out.println("output.csv を確認してください。");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (br != null) br.close();
if (pw != null) pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Java実行結果(output.csv)
名前,国
Tom,USA
Hanako,Japan
Yuki,Japan
Sara,UK
ポイント解説
split(“,”) で列ごとに分割
- CSV の各行をカンマで区切って配列にする
String[]に格納 → 行ごとのリストArrayList<String[]>に追加
抜き出したい列番号を指定
int[] columnsToExtract = {0, 2};
Java- 0番目と2番目の列だけ抜き出す
- 配列が足りない場合は空文字で埋める
書き出すとき
String.join(",", selectedCols)で配列をカンマ区切りに変換- PrintWriter で行単位に書き込む
応用例
- 複数列抽出
int[] columnsToExtract = {1,2}; // 年齢と国
Java- 列の順番を入れ替えて書き出す
int[] columnsToExtract = {2,0}; // 国, 名前
Java- 条件付き抽出(国が Japan の行だけ)
if(row[2].equals("Japan")) { ... }
Java- ArrayList ではなく配列や Stream API を使う方法
- ヘッダー行をスキップ / 抽出する方法
