CSV出力はどの言語でもよく使います。業務系のシステムを作ると、実績や計画、予定情報をどうしても外部連携するという必要性がでてきます。単純にBIツール等を使って出力する場合もありますが、業務仕様によって複雑な編集等が必要になるケースがあり、自分で作成するケースが多いです。項目ごとに修正しやすいようにあえて複雑な構文を使わず、愚直で簡単なCSV出力について掲載します。
- CSV出力(サーブレット/サーバサイド)
// 出力データを編集
List<TestEntity> listData = new ArrayList<TestEntity>();
// CSVデータ(1レコード分)のオブジェクトをインスタンス化する
TestEntity testEntity = new TestEntity();
// CSV項目を編集
testEntity.cd = "100";
testEntity.name = "名称";
// CSVデータ(データEntity)を追加する
listData.add(testEntity);
// 対象データが存在する場合は、CSV出力を行う
if (listData != null && listData.size() > 0) {
// フォルダ名を設定
String strCsvFolder = "csv" + "/" + "dirName";
String strCsvFileName = "";
// ファイルシステム上の絶対パスを返す。
String strCsvPath = RequestUtil.getRequest().getSession().getServletContext().getRealPath(strCsvFolder);
// フォルダが存在しない場合作成する。
File csvDirFile = new File(strCsvPath);
if(!csvDirFile.exists()) {
csvDirFile.mkdir();
}
// CSVのサーバのURLを取得する場合
String strCsvUrl = RequestUtil.getRequest().getSession().getServletContext().getContextPath() + "/" + strCsvFolder + "/";
// 既にあるCSVファイルを削除する場合
// ※前回出力したファイル等を削除する際に利用しています。
File delFile = new File(strCsvPath+"/"+"csvFileName");
delFile.delete();
// 保持期間が過ぎたその他CSVファイルが存在する場合は削除する。
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date nowDate = new Date();
// 保持期間を算出する。
Calendar cal = Calendar.getInstance();
// 現在時刻を設定
cal.setTime(nowDate);
// 保持期間(10日)を減算
cal.add(Calendar.DATE, -10);
int delDay = Integer.parseInt(sdf.format(cal.getTime()));
// 保持期間が過ぎた出力CSVファイルを出力フォルダのファイルリストを検索し削除する。
File dir = new File(strCsvPath);
File[] files = dir.listFiles();
if (files != null) {
// ファイルリストの件数分、処理する
for (int i = 0; i < files.length; i++) {
File file = files[i];
// ファイルの更新日時取得
Date upDate = new Date(file.lastModified());
int iUpDate = Integer.parseInt(sdf.format(upDate));
// 保持期間が過ぎたファイルは削除する。
if (iUpDate < delDay) {
// ファイルを削除する。
file.delete();
}
}
}
// CSVファイル名を作成する。(ファイル名に日時を結合する)
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
strCsvFileName = "csvFileName_"+sdf2.format(nowDate)+".csv";
// CSV出力データが存在する場合は、CSV出力する
File fileWork = null;
PrintWriter pw = null;
int iWriteCnt = 0;
String strLineData = "";
try {
// 出力ファイルオブジェクトを生成する
fileWork = new File(strCsvPath+"/"+strCsvFileName);
// ストリームよりPrintWriterを生成(文字コード:Windows-31J)
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileWork),"Windows-31J")));
// 出力対象データの件数分、処理を繰り返す(ループ)
for (int i=0;i<listData.size();i++) {
// CSV1レコードを取得する。
TestEntity testEntityWork = (TestEntity) listData.get(i);
// 1件目は見出しを編集する。
if (iWriteCnt == 0) {
// 見出しを編集する。
strLineData = "";
strLineData = strLineData + "コード";
strLineData = strLineData + ",";
strLineData = strLineData + "名称";
// CSVを出力(1行分)する。
pw.println(strLineData);
// 出力件数をカウントアップする
iWriteCnt++;
}
//--------------------------------------------------------------------
// CSVデータを編集する。
strLineData = "";
strLineData = strLineData + testEntityWork.cd;
strLineData = strLineData + ",";
strLineData = strLineData + testEntityWork.name;
// CSVを出力(1行分)する。
pw.println(strLineData);
// 出力件数をカウントアップする
iWriteCnt++;
}
//--------------------------------------------------------------------
// ファイルをクローズする。
pw.close();
} catch (IOException e) {
// 異常時
}
}
package test.entity;
/**
* CSVエンティティ
*
*/
public class TestEntity {
/*
* CSVデータの1レコード項目
*/
/*
* コード
*/
public String cd;
/*
* 名称
*/
public String name;
}
※CSV出力時には、以下のような事が必要となるケースが多いです。
- ファイル名に日時を付与する
- 同一ファイル名がある場合は削除する(または上書きする)
- 保持期間によるファイル削除(バッチ等、別プロセスでやる事が多い)