[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型なんかに自動変換してくれるので、とても楽です。