Javaその他

Javaで大量のデータをCSVファイルに出力できるようにしてみた

大量のデータをCSVファイル等に出力する際は、出力データ作成用のプログラムを作成しておくと便利である。今回は、以下のUSER_DATAテーブルに取込を行うためのCSVファイルを出力するプログラムを作成してみたので、共有する。
USER_DATAテーブル

前提条件

下記記事のIntelliJ IDEA Community版をダウンロード済であること。

IntelliJ IDEAをインストールしてみた「IntelliJ IDEA(インテリジェイ アイディア)」という、Eclipseと同等の機能をもつJava用統合開発環境を使って、Sp...

また、下記のように、「demoJava」というJavaプロジェクトを作成済であること。
demoJavaプロジェクト

なお、IntelliJ IDEA上でJavaプロジェクトを作成する方法については、IntelliJ IDEA Community版をダウンロードする記事内の、「IntelliJ IDEA上でのJavaプロジェクトの作成・実行」を参照のこと。



サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、今回新規で作成したプログラムである。

ソースコードの内容は以下の通りで、C:\tmpフォルダ下に、「user_data_(fileIdxの値).csv」というファイルを作成し、IDが(startIdxの値)から(dataCnt数)分のデータを出力するようになっている。

package demo.java;

import java.io.File;
import java.io.FileWriter;

public class MakeUserDataCsv {
    /** ファイル名に付与するインデックス */
    private static final int fileIdx = 1;
    /** IDの開始位置 */
    private static final int startIdx = 1;
    /** 書き込みデータ数 */
    private static final int dataCnt = 5;

    /**
     * テスト用CSVデータを作成するメイン処理
     * @param args 起動時に受け取る引数
     */
    public static void main(String[] args) {
        // 書き込み用ファイルを作成する(ファイルが存在する場合は上書き)
        String newFileName = "c:\\tmp\\user_data_" + fileIdx + ".csv";
        File newFile = new File(newFileName);

        try (FileWriter fw = new FileWriter(newFile)) {
            // ファイルの先頭にカラム行を設置する
            fw.write("ID,NAME,BIRTH_YEAR,BIRTH_MONTH,BIRTH_DAY,SEX,MEMO");
            fw.write(System.lineSeparator());

            // ファイルにテストデータを書き込む
            // その際、生年月日は2012年1月15日で固定とする
            for (int i = startIdx; i < startIdx + dataCnt; i++) {
                String zenkakuNum = changeNumHalfToFull(i);
                int sexCode = (i - 1) % 2 + 1;
                fw.write(i + ",\"テスト プリン" + zenkakuNum + "\",2012,1,15,\"" 
                         + sexCode + "\",\"テスト" + zenkakuNum + "\"");
                fw.write(System.lineSeparator());
            }
            System.out.println("ファイルの書き込みが完了しました。ファイル名:" 
                + newFileName + ",データ数:" + dataCnt);

        } catch (Exception ex) {
            System.err.println(ex);
        }
    }

    /**
     * 半角数字を全角数字に変換する.
     * @param num 変換前の半角数字
     * @return 全角数字
     */
    private static String changeNumHalfToFull(int num) {
        String result = null;
        StringBuilder sb = new StringBuilder(String.valueOf(num));
        for (int i = 0; i < sb.length(); i++) {
            int c = (int) sb.charAt(i);
            if (c >= 0x30 && c <= 0x39) {
                sb.setCharAt(i, (char) (c + 0xFEE0));
            }
        }
        result = sb.toString();
        return result;
    }
}
「FlexClip」はテンプレートとして利用できる動画・画像・音楽などが充実した動画編集ツールだったテンプレートとして利用できるテキスト・動画・画像・音楽など(いずれも著作権フリー)が充実している動画編集ツールの一つに、「FlexCli...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) fileIdx, startIdx, dataCntが以下の状態で実行したときのコンソールログと出力されたCSVファイルの内容は以下の通りで、「user_data_1.csv」というファイルにID=1~5のデータが出力されていることが確認できる。
サンプルプログラムの実行結果_1_1

<コンソールログ>
サンプルプログラムの実行結果_1_2

<CSVファイル>
サンプルプログラムの実行結果_1_3

サンプルプログラムの実行結果_1_4



2) fileIdx, startIdx, dataCntが以下の状態で実行したときのコンソールログと出力されたCSVファイルの内容は以下の通りで、「user_data_2.csv」というファイルにID=21~30のデータが出力されていることが確認できる。
サンプルプログラムの実行結果_2_1

<コンソールログ>
サンプルプログラムの実行結果_2_2

<CSVファイル>
サンプルプログラムの実行結果_2_3

サンプルプログラムの実行結果_2_4

要点まとめ

  • 大量のデータをCSVファイル等に出力する際は、出力データ作成用のプログラムを作成しておくと便利である。