[java]Super CSV による File Read

Super CSVは、CSVファイルをオブジェクトのような感覚で扱うことができる、オープンソースCSVファイル高速アクセスライブラリです。言ってみればO/RマッピングCSVファイル版ですね。
http://supercsv.sourceforge.net/
これが非常に便利そうなのに、何故かサイトに載っているサンプルコードが微妙に不親切なので、簡単に書き換えてみました。


読み込むCSVファイルの内容は次のような感じです。
ファイル名:foo.csv

username, password,   date,        zip,  town
Klaus,    qwexyKiks,  17/1/2007,   1111, New York
Oufu,     bobilop,    10/10/2007,  4555, New York

さて、まずはBeanの定義。このクラスでは、CSVファイルの列要素を定義します。
ファイル名:UserBean.java

package bean;

import java.util.Date;

import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.ParseDate;
import org.supercsv.cellprocessor.ParseInt;
import org.supercsv.cellprocessor.constraint.StrMinMax;
import org.supercsv.cellprocessor.constraint.Unique;
import org.supercsv.cellprocessor.ift.CellProcessor;

/**
 * CSVファイルの要素定義(Bean)
 * @author kazuki.kido
 */
public class UserBean {
    
    /** 各要素フォーマット定義 */
    public static final CellProcessor[] processors = new CellProcessor[] {
            new Unique(new StrMinMax(4, 20)),    // username
            new StrMinMax(7, 35),                // password
            new ParseDate("dd/MM/yyyy"),         // date
            new Optional(new ParseInt()),        // zip
            null                                 // town
    };
    
    /* 各要素の Getter/Setter 定義 */
    
    private String username, password, town;
    private Date date;
    private int zip;

    public String getPassword() { return password; }
    public Date getDate() { return date; }
    public String getTown() { return town; }
    public String getUsername() { return username; }
    public int getZip() { return zip; }
    public void setPassword(String password) { this.password = password; }
    public void setDate(Date date) { this.date = date; }
    public void setTown(String town) { this.town = town; }
    public void setUsername(String username) { this.username = username; }
    public void setZip(int zip) { this.zip = zip; }
}

で、実際に読み込み処理を行うmain実装が↓のようなかんじになります。読み込んだ内容をコンソール出力します。
ファイル名:ReadingObjects.java

package read;

import java.io.FileReader;

import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;

import bean.UserBean;

/**
 * SuperCSVによるCSVファイル読み込み
 * @author kazuki.kido
 */
public class ReadingObjects {
    
    public static void main(String[] args) throws Exception{
        ICsvBeanReader inFile = new CsvBeanReader(
            new FileReader("./data/foo.csv"), CsvPreference.EXCEL_PREFERENCE);
        try {
            final String[] header = inFile.getCSVHeader(true);
            UserBean user = null;
            while((user = inFile.read(UserBean.class, header,
                            UserBean.processors)) != null){
                // 取得要素をコンソールへ出力
                System.out.print("ユーザ名:" + user.getUsername());
                System.out.print(" パスワード:" + user.getPassword());
                System.out.print(" 日付:" + user.getDate());
                System.out.print(" 郵便番号:" + user.getZip());
                System.out.println(" 住所:" + user.getTown());
            }
        } finally {
            inFile.close();
        }
    }
}

で、コンソール出力結果がこんなかんじになります。

ユーザ名:Klaus パスワード:qwexyKiks 日付:Wed Jan 17 00:00:00 JST 2007 郵便番号:1111 住所:New York
ユーザ名:Oufu パスワード:bobilop 日付:Wed Oct 10 00:00:00 JST 2007 郵便番号:4555 住所:New York

Beanを介してCSVファイルの内容を簡単に取得できます。定義に沿ってDate型なんかに自動変換してくれるので、とても楽です。


ちなみにプロジェクト構成は以下の通り。