JavaでCSV出力の方法
この記事では、JavaのCSV出力法を解説します!
CSVに限らず、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」は、追記・上書きの制御をしています。
- true:追記
- 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(); } } }
■実行結果
このように、同じデータが追記されています。
バッファリング処理とは、データを一旦バッファ(メモリー)に預ける処理をいいます。
例えば、書き込み処理であれば、バッファに蓄積し、データが満杯になった時点でファイルに出力します。
こうすることで、データを一括で処理できるため、データ読み書きを効率化できるという仕組みです。