List<List<String>>の形式で保持した二次元配列(動的なデータ構造)をCSVファイルに出力するJavaコードを以下に示します。このコードは、標準的なCSV形式のデータを外部ファイルに書き込むものです。
サンプルコード:List<List<String>>をCSVファイルに出力する
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ListToCsv {
public static void main(String[] args) {
// 二次元Listを定義する
List<List<String>> data = new ArrayList<>();
// ヘッダー行を追加
List<String> header = new ArrayList<>();
header.add("名前");
header.add("年齢");
header.add("職業");
data.add(header);
// 行データを追加
List<String> row1 = new ArrayList<>();
row1.add("山田太郎");
row1.add("30");
row1.add("エンジニア");
data.add(row1);
List<String> row2 = new ArrayList<>();
row2.add("鈴木一郎");
row2.add("25");
row2.add("デザイナー");
data.add(row2);
List<String> row3 = new ArrayList<>();
row3.add("佐藤花子");
row3.add("28");
row3.add("マネージャー");
data.add(row3);
// CSVファイルに出力
String filePath = "output.csv"; // 出力ファイルのパス
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
// Listの内容を1行ずつCSV形式で出力
for (List<String> row : data) {
writer.write(String.join(",", row));
writer.newLine(); // 行末に改行を追加
}
System.out.println("CSVファイルが作成されました。パス: " + filePath);
} catch (IOException e) {
System.err.println("CSVファイルの出力中にエラーが発生しました: " + e.getMessage());
}
}
}
コードの説明
List<List<String>>の準備:
List<List<String>>を二次元配列の代わりに使用します。- 各行は
List<String>として保持し、全体をList<List<String>>で管理します。
- データの追加:
- ヘッダー行(列名)やデータ行を動的に追加します。
- CSVファイルへの書き込み:
BufferedWriterとFileWriterを使用してファイルにデータを書き込みます。- 各行(
List<String>)をString.join(",", row)を使用してカンマ区切りフォーマットに変換します。
- エラー処理:
try-with-resources構文を利用して、安全にリソース(ファイル)を閉じています。
実行結果
上記コードを実行した場合、次のような内容の「output.csv」というCSVファイルが作成されます:
名前,年齢,職業
山田太郎,30,エンジニア
鈴木一郎,25,デザイナー
佐藤花子,28,マネージャー
応用例: ユーザーデータを動的に取得してCSV出力
もしCSVに出力するデータをユーザーから入力させたい場合は、以下の変更を加えることもできます。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class DynamicListToCsv {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 二次元Listを準備
List<List<String>> data = new ArrayList<>();
// ヘッダー行を追加
List<String> header = new ArrayList<>();
header.add("名前");
header.add("年齢");
header.add("職業");
data.add(header);
System.out.print("データを入力する行数を指定してください: ");
int rowCount = scanner.nextInt();
scanner.nextLine(); // 次の行に進むためのバッファクリア
// ユーザー入力でデータを追加
for (int i = 0; i < rowCount; i++) {
System.out.println("行 " + (i + 1) + " を入力します:");
List<String> row = new ArrayList<>();
System.out.print("名前: ");
row.add(scanner.nextLine());
System.out.print("年齢: ");
row.add(scanner.nextLine());
System.out.print("職業: ");
row.add(scanner.nextLine());
data.add(row);
}
// ファイルパス
String filePath = "output.csv";
// CSVファイルに出力
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
for (List<String> row : data) {
writer.write(String.join(",", row));
writer.newLine();
}
System.out.println("CSVファイルが作成されました。パス: " + filePath);
} catch (IOException e) {
System.err.println("CSVファイルの出力中にエラーが発生しました: " + e.getMessage());
}
scanner.close();
}
}
このコードでは、ユーザーが入力するたびに列データがList<List<String>>に追加され、最終的に指定されたCSVファイルに出力されます。
注意事項
- ファイルのエンコーディング:
- 書き込むファイルのエンコーディング(文字コード)はシステム依存です。日本語の文字が含まれる場合、環境によって文字化けを防止するために、
OutputStreamWriterを使い、UTF-8エンコーディングを指定するとよいでしょう。
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.csv"), "UTF-8"));
- CSVフォーマットの注意点:
- データにカンマ(
,)や改行(\n)が含まれる場合、エスケープが必要です。こうした場合には、OpenCSVやApache Commons CSVなどの専用ライブラリを使用することを検討してください。
もし他に追加の修正や拡張が必要であれば、お気軽にお知らせください!

コメント