JavaのCSVファイル出力

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());
        }
    }
}

コードの説明

  1. List<List<String>>の準備:
  • List<List<String>>を二次元配列の代わりに使用します。
  • 各行はList<String>として保持し、全体をList<List<String>>で管理します。
  1. データの追加:
  • ヘッダー行(列名)やデータ行を動的に追加します。
  1. CSVファイルへの書き込み:
  • BufferedWriterFileWriterを使用してファイルにデータを書き込みます。
  • 各行(List<String>)をString.join(",", row)を使用してカンマ区切りフォーマットに変換します。
  1. エラー処理:
  • 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ファイルに出力されます。


注意事項

  1. ファイルのエンコーディング:
  • 書き込むファイルのエンコーディング(文字コード)はシステム依存です。日本語の文字が含まれる場合、環境によって文字化けを防止するために、OutputStreamWriterを使い、UTF-8エンコーディングを指定するとよいでしょう。
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.csv"), "UTF-8"));
  1. CSVフォーマットの注意点:
  • データにカンマ(,)や改行(\n)が含まれる場合、エスケープが必要です。こうした場合には、OpenCSVApache Commons CSVなどの専用ライブラリを使用することを検討してください。

もし他に追加の修正や拡張が必要であれば、お気軽にお知らせください!

コメント

タイトルとURLをコピーしました