バナー画像

JavaでCSV出力の方法

この記事では、JavaのCSV出力法を解説します!

CSVに限らず、Javaでファイルを出力する流れは以下の通りです。

Javaでファイルを出力する流れ
  • ファイルを開く
  • ファイルに書き込む
  • ファイルを閉じて出力

それぞれの処理について、簡単に説明していきます。

(1)ファイルを開く

Javaでファイルを開くには、FileWriterクラスを使います。

FileWriterクラスは、文字ファイルを書き込むためのクラスです。

開くファイルがない場合は、新しくファイルを作成してくれます。

(2)ファイルに書き込む

ファイルを開いた後に、文字や情報を書き込む処理が入ります。

具体的な書き込み方法は後述します!

(3)ファイルを閉じて出力

厳密には、ファイルを閉じる処理が入ることで、実際のファイルに文字列が書き込まれます。

ファイルを閉じた後に出力することで、目的のファイルを保存できます。

では、この流れを元に、CSV出力の方法を見ていきましょう。

CSV出力のサンプルコード

ここでは、CSVファイルを出力するサンプルコードを紹介します。

サンプルコードは次の通りです。

■記述例
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;

public class Userdata {
    public static void main(String args[]) {
        // CSVに書き込む内容を記述
        int[] number = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        String[] userName = {"阿部", "鈴木", "伊藤", "田中", "太田", "佐々木", "上野", "馬場", "榎本", "和田"};
        String[] userSex = {"男", "男", "女", "女", "男", "男", "男", "女", "男", "男"};
        String[] userDepartment = {"営業部", "総務部", "人事部", "営業部", "開発部", "開発部", "人事部", "営業部", "開発部", "総務部"};
        int[] userSalary = {280000, 320000, 250000, 330000, 210000, 250000, 320000, 280000, 250000, 210000};
        // exportCsvクラスに渡す
        exportCsv(number, userName, userSex, userDepartment, userSalary);
    }

    public static void exportCsv(int[] number, String[] userName, String[] userSex, String[] userDepartment, int[] userSalary){
        try {
            // 出力ファイルの作成
            FileWriter fw = new FileWriter("Userdata.csv", false);
            // PrintWriterクラスのオブジェクトを生成
            PrintWriter pw = new PrintWriter(new BufferedWriter(fw));

            // ヘッダーの指定
            pw.print("社員番号");
            pw.print(",");
            pw.print("名前");
            pw.print(",");
            pw.print("性別");
            pw.print(",");
            pw.print("部署");
            pw.print(",");
            pw.print("給料");
            pw.println();

            // データを書き込む
            for(int i = 0; i < number.length; i++){
                pw.print(number[i]);
                pw.print(",");
                pw.print(userName[i]);
                pw.print(",");
                pw.print(userSex[i]);
                pw.print(",");
                pw.print(userDepartment[i]);
                pw.print(",");
                pw.print(userSalary[i]);
                pw.println();
            }

            // ファイルを閉じる
            pw.close();

            // 出力確認用のメッセージ
            System.out.println("csvファイルを出力しました");

        // 出力に失敗したときの処理
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

■実行結果
mbp:Desktop potepan$ java Userdata
csvファイルを出力しました

上記のように、Javaで書き込んだ内容がCSVファイルで出力できました。

それぞれの処理について、解説します。

(1)import部分について

まずは、Javaファイル冒頭のimport部分について説明します。

import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;

「import java.io.FileWriter」は、前述したようにファイルを開く・書き込む際に必要です。

「import java.io.BufferedWriter」で、文字をバッファリングします。

文字をバッファリングすることで、文字・配列・文字列を効率良く、文字型出力ストリームに書き込めるのです。

ポテパンダの一言メモ

バッファリング処理とは、データを一旦バッファ(メモリー)に預ける処理をいいます。

例えば、書き込み処理であれば、バッファに蓄積し、データが満杯になった時点でファイルに出力します。

こうすることで、データを一括で処理できるため、データ読み書きを効率化できるという仕組みです。

また、BufferedWriterクラスで用意されている「newLine()」メソッドを使えば、改行文字を書き込んでくれるなど、さまざまなメリットがあります。

「import java.io.PrintWriter」で、ファイルに書き込む処理を行います。

「import java.io.IOException」は、入出力時の例外発生を通知するために必要です。

(2)mainクラスについて

public static void main(String args[]) {
        // CSVに書き込む内容を記述
        int[] number = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        String[] userName = {"阿部", "鈴木", "伊藤", "田中", "太田", "佐々木", "上野", "馬場", "榎本", "和田"};
        String[] userSex = {"男", "男", "女", "女", "男", "男", "男", "女", "男", "男"};
        String[] userDepartment = {"営業部", "総務部", "人事部", "営業部", "開発部", "開発部", "人事部", "営業部", "開発部", "総務部"};
        int[] userSalary = {280000, 320000, 250000, 330000, 210000, 250000, 320000, 280000, 250000, 210000};
        // exportCsvクラスに渡す
        exportCsv(number, userName, userSex, userDepartment, userSalary);
}

上記部分の処理を説明します。

とはいえ、見ればわかるように、CSVファイルに書き込みたいデータを定義しているクラスです。

それぞれ、データ型配列で要素を記述しています。

必要なデータ分だけ配列を用意すればOKです。

exportCsv(number, userName, userSex, userDepartment, userSalary);

上記の部分で、exportCsvクラスにデータをまとめて渡しています。

(3)出力ファイルの作成部分について

// 出力ファイルの作成
FileWriter fw = new FileWriter("Userdata.csv", false);
// PrintWriterクラスのオブジェクトを生成
PrintWriter pw = new PrintWriter(new BufferedWriter(fw));

上記の部分について詳しく見ていきましょう!

// 出力ファイルの作成
FileWriter fw = new FileWriter("Userdata.csv", false);

FileWriterクラスのオブジェクト(fw)を生成しています。

オブジェクトの生成に合わせて、ファイルを開く処理も行っているのです。

ここでは、「Userdata.csv」という名前のCSVファイルが存在すれば開き、存在しない場合は新規作成します。

第2引数の「false」は、追記・上書きの制御をしています。

といった風な処理になります。ここでは上書きとしました。

// PrintWriterクラスのオブジェクトを生成
PrintWriter pw = new PrintWriter(new BufferedWriter(fw));

PrintWriterクラスのオブジェクトを(pw)生成しています。

「new BufferedWriter(fw)」の処理も入れることで、文字のバッファリングも合わせて行っているのです。

(4)ヘッダーを作成する

// ヘッダーの指定
pw.print("社員番号");
pw.print(",");
pw.print("名前");
pw.print(",");
pw.print("性別");
pw.print(",");
pw.print("部署");
pw.print(",");
pw.print("給料");
pw.println();

上記の記述で、CSVファイルのヘッダーを作成しています。

ヘッダーが不要であれば、この記述は不要です!

カンマ区切りで記述することで、列を作成しています。

そして、最後の「pw.println();」で、改行を入れています。

(5)データを書き込む

// データを書き込む
for(int i = 0; i < number.length; i++){
pw.print(number[i]);
pw.print(",");
pw.print(userName[i]);
pw.print(",");
pw.print(userSex[i]);
pw.print(",");
pw.print(userDepartment[i]);
pw.print(",");
pw.print(userSalary[i]);
pw.println();
}

上記の処理で、データを1行ずつ書き込んでいます。

ヘッダー部分と仕組みは同じです。

for文をデータの数分回すことで、全てのデータを書き込んでいます。

(6)ファイルを閉じて出力

// ファイルを閉じる
pw.close();

// 出力確認用のメッセージ
System.out.println("csvファイルを出力しました");

最後に、close()メソッドでCSVファイルを閉じ、出力を行います。

出力確認用のメッセージが、確認ようなのでなくてもOKです!

プログラムを実行すれば、CSVファイルが出力されます。

(7)出力に失敗したときの処理

// 出力に失敗したときの処理
} catch (IOException ex) {
ex.printStackTrace();
}

IOExceptionで、入出力時の例外発生を通知しています。

printStackTrace()メソッドで、スタックトレースを出力します。

ポテパンダの一言メモ

スタックトレースとは、実行したメソッドの時系列の一覧のことです。

例外が発生した際に、

・例外が発生したメソッド
・例外発生までに経たメソッド

がわかるようになっています。

表示は、新しいものが上に、古いものが下に表示されます。

CSV出力でダブルクォーテーションを出力する

ダブルクォーテーションを出力するには、エスケープシーケンスを使います。

記述方法は、「”\””」です。

今回の例では、次のように変更してみました。

// データを書き込む
for(int i = 0; i < number.length; i++){
pw.print(number[i]);
pw.print(",");
pw.print("\"" + userName[i] + "\"");
pw.print(",");
pw.print(userSex[i]);
pw.print(",");
pw.print(userDepartment[i]);
pw.print(",");
pw.print(userSalary[i]);
pw.println();
}

名前の部分だけダブルクォーテーションで囲んでみました。

出力結果は次の通りです。

このように出力できています。

ただし、出力はCSVファイルを開くツールによって異なります。

今回は、「Atom」というテキストエディタで確認しています。

先ほどの結果で見せた「Numbers」では、残念ながら表示されませんでした。

csv出力で改行を出力する

改行を出力する場合は、サンプルコードでも書いているように「pw.println();」でOKです。

もしくは、改行もエスケープシーケンスを使って「”\n”」と表せます。

サンプルコードをエスケープシーケンスを使って記述すると、次の通りです。

// ヘッダーの指定
pw.print("社員番号");
pw.print(",");
pw.print("名前");
pw.print(",");
pw.print("性別");
pw.print(",");
pw.print("部署");
pw.print(",");
pw.print("給料");
pw.print("\n");

// データを書き込む
for(int i = 0; i < number.length; i++){
pw.print(number[i]);
pw.print(",");
pw.print(userName[i]);
pw.print(",");
pw.print(userSex[i]);
pw.print(",");
pw.print(userDepartment[i]);
pw.print(",");
pw.print(userSalary[i]);
pw.print("\n");
}

実行結果は同じになり、ちゃんと改行されます!

CSV出力で追記するには?

CSVファイルに追記するには、FileWriterの第2引数を「true」にすればOKです。

// 出力ファイルの作成
FileWriter fw = new FileWriter("Userdata.csv", true);

これで追記できるようになります。

試しに、ファイルを作成している状態で、下記のようにヘッダー部分をコメントアウトして実行してみます。

■記述例
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;

public class Userdata {
    public static void main(String args[]) {
        // CSVに書き込む内容を記述
        int[] number = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        String[] userName = {"阿部", "鈴木", "伊藤", "田中", "太田", "佐々木", "上野", "馬場", "榎本", "和田"};
        String[] userSex = {"男", "男", "女", "女", "男", "男", "男", "女", "男", "男"};
        String[] userDepartment = {"営業部", "総務部", "人事部", "営業部", "開発部", "開発部", "人事部", "営業部", "開発部", "総務部"};
        int[] userSalary = {280000, 320000, 250000, 330000, 210000, 250000, 320000, 280000, 250000, 210000};
        // exportCsvクラスに渡す
        exportCsv(number, userName, userSex, userDepartment, userSalary);
    }
    public static void exportCsv(int[] number, String[] userName, String[] userSex, String[] userDepartment, int[] userSalary){
        try {
            // 出力ファイルの作成
            FileWriter fw = new FileWriter("Userdata.csv", true);
            // PrintWriterクラスのオブジェクトを生成
            PrintWriter pw = new PrintWriter(new BufferedWriter(fw));

            // ヘッダーの指定
            // pw.print("社員番号");
            // pw.print(",");
            // pw.print("名前");
            // pw.print(",");
            // pw.print("性別");
            // pw.print(",");
            // pw.print("部署");
            // pw.print(",");
            // pw.print("給料");
            // pw.println();

            // データを書き込む
            for(int i = 0; i < number.length; i++){
                pw.print(number[i]);
                pw.print(",");
                pw.print(userName[i]);
                pw.print(",");
                pw.print(userSex[i]);
                pw.print(",");
                pw.print(userDepartment[i]);
                pw.print(",");
                pw.print(userSalary[i]);
                pw.println();
            }

            // ファイルを閉じる
            pw.close();

            // 出力確認用のメッセージ
            System.out.println("csvファイルを出力しました");

        // 出力に失敗したときの処理
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

■実行結果

このように、同じデータが追記されています。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。