SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

オープンソースCSVライブラリ「OrangeSignal CSV」の勧め

JavaでCSVの読み書きを快適に!
~「OrangeSignal CSV」概要

オープンソースCSVライブラリ「OrangeSignal CSV」とは

  • X ポスト
  • このエントリーをはてなブックマークに追加

OrangeSignal CSVの導入

 ここでは、執筆時点での最新版であるバージョン1.2.3を例に取り解説していきます。

  1. OrangeSignal ダウンロードサイトからOrangeSignal CSVのバイナリパッケージをダウンロードします。
  2. ダウンロードしたZIP形式のバイナリパッケージを解凍して、orangesignal-csv-1.2.3.jarファイルとjlha-0.06-05.jarファイルへクラスパスを通せば準備完了です。
補足

 orangesignal-csv-1.2.3.jarファイル、jlha-0.06-05.jarファイルの代わりに、これらのファイルを一体化したorangesignal-csv-1.2.3-with-jlha.jarファイルへクラスパスを通してもOKです。

OrangeSignal CSVで簡単アクセス

 OrangeSignal CSVでCSVへアクセスするには、Csvユーティリティを使用する方法と、CsvManagerを使用する2種類の方法があります。

 Csvユーティリティは、CSVへの統合アクセス機能を提供するユーティリティです。CSVの読み込みはloadメソッド、書き込みはsaveメソッドがそれぞれ提供されており、「CSV形式」「オブジェクトへのマッピング方法」「CSVファイルやストリームなどのCSVデータ」を指定することでアクセスを行います。

// 読み込み
List<String[]> list = Csv.load(new File("codezine.csv"), new CsvConfig(), new StringArrayListHandler());

// 書き込み
Csv.save(list, new File("codezine.csv"), new CsvConfig(), new StringArrayListHandler());

 この例では「codezine.csv」というファイル名で、デフォルトのCSV形式で読み書きを行っています。また、オブジェクトのマッピング方法として、文字列配列のリストでマッピングするStringArrayListHandlerを使用しています。

 次に、CsvManagerを使用したPOJOオブジェクトでのCSVアクセスを紹介します。

 CsvManagerはPOJOオブジェクトでのCSVアクセスを容易にするための統合アクセスインターフェースです。POJOオブジェクトでのCSVアクセスは、Csvユーティリティを使用するよりCsvManagerを使用した方が可読性もよく、簡単に行うことができます。

// 読み込み
List<Customer> customers = new CsvManagerFactory.newCsvManager()
        .load(Customer.class);
        .from(new File("customers.csv"));

// 書き込み
CsvManagerFactory.newCsvManager()
        .save(customers, Customer.class)
        .to(new File("customers.csv"));

OrangeSignal CSVの構成

 ここでは、Csv統合アクセスユーティリティやCsvManager統合アクセスインターフェースを使用するうえで必要不可欠な、CSV形式情報(CsvConfig)やデータアクセスハンドラ(CsvHandler)などについて説明していきます。

CsvConfig

 CsvConfigは、区切り文字や囲み文字などCSV形式(CSV方言)に関する設定情報を管理するクラスです。

// デフォルトでは区切り文字(,)のみが有効な状態で、囲み文字(")やエスケープ文字(\)は無効となっています。
CsvConfig cfg = new CsvConfig();

// 区切り文字と囲み文字、エスケープ文字を指定してCSV形式設定情報を構築した場合は、
// 自動的に無効化が解除され有効となります。
CsvConfig cfg = new CsvConfig(',', '"', '"');

// 区切り文字としてタブ文字(\t)を指定する例です。ただし、囲み文字(")やエスケープ文字(\)は無効となったままです。
CsvConfig cfg = new CsvConfig('\t');

 CsvConfigでその他の高度な設定を行う場合は、CsvConfigをインスタンス化した後に設定を行います。

CsvConfig cfg = new CsvConfig();
cfg.setQuoteDisabled(false);                         // デフォルトでは無効となっている囲み文字を有効にします。
cfg.setEscapeDisabled(false);                        // デフォルトでは無効となっているエスケープ文字を有効にします。
cfg.setBreakString("\n");                            // 項目値中の改行を\nで置換えます。
cfg.setNullString("NULL");                           // null値扱いする文字列を指定します。
cfg.setIgnoreLeadingWhitespaces(true);               // 項目値前のホワイトスペースを除去します。
cfg.setIgnoreTrailingWhitespaces(true);              // 項目値後のホワイトスペースを除去します。
cfg.setIgnoreEmptyLines(true);                       // 空行を無視するようにします。
cfg.setIgnoreLinePatterns(Pattern.compile("^#.*$")); // 正規表現による無視する行パターンを設定します(この例では#で始まる行)。
cfg.setSkipLines(1);                                 // 最初の1行目をスキップして読み込みます。

// Csv統合アクセスユーティリティでの使用例
List<String[]> list = Csv.load(new File("example.csv"), cfg, new StringArrayListHandler());

// CsvManager統合アクセスインターフェースでの使用例
List<Customer> customers = CsvManagerFactory.newCsvManager()
        .config(cfg)
        .load(Customer.class)
        .from(new File("customers.csv"));

CsvHandler

 CsvHandlerはCSVデータへのアクセスとオブジェクト変換を実質的に管理するデータアクセスハンドラです。マッピングするオブジェクトの形式に合わせて各種ハンドラが提供されています。

CsvHandler マッピング・オブジェクトの型
StringArrayListHandler List<String[]>
ResultSetHandler ResultSet
ColumnNameMapListHandler List<Map<String, String>>
ColumnPositionMapListHandler List<Map<Integer, String>>
BeanListHandler POJOオブジェクトのリスト
ColumnNameMappingBeanListHandler POJOオブジェクトのリスト
ColumnPositionMappingBeanListHandler POJOオブジェクトのリスト
CsvEntityListHandler CsvEntityアノテーション付きPOJOオブジェクトのリスト

StringArrayListHandler

 StringArrayListHandlerは、文字列配列のリストでCSVデータへのアクセスを可能とするハンドラです。

// 入力
List list = Csv.load(file, cfg, new StringArrayListHandler());

// 出力
Csv.save(list, file, cfg, new StringArrayListHandler());

ResultSetHandler

 ResultSetHandlerは、データベースの結果セットでCSVデータへのアクセスを可能とするハンドラです。

// 入力
ResultSet rs = Csv.load(file, cfg, new ResultSetHandler());

// 出力
Csv.save(rs, file, cfg, new ResultSetHandler());

ColumnNameMapListHandler

 ColumnNameMapListHandlerは、CSVヘッダ行の項目名とCSVデータの項目値とのマップオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。

// 入力
List<Map<String, String>> list = Csv.load(file, cfg, new ColumnNameMapListHandler());

// 出力
Csv.save(list, file, cfg, new ColumnNameMapListHandler());

ColumnPositionMapListHandler

 ColumnPositionMapListHandlerは、CSVヘッダ行の項目位置とCSVデータの項目値とのマップオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。

// 入力
List<Map<Integer, String>> list = Csv.load(file, cfg, new ColumnPositionMapListHandler());

// 出力
Csv.save(list, file, cfg, new ColumnPositionMapListHandler());

BeanListHandler

 BeanListHandlerは、POJOオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。このハンドラはCSVヘッダ行の項目名とPOJOオブジェクトのフィールド名を対応付けて処理します。

// 入力
List customers = Csv.load(file, cfg, new BeanListHandler<Customer>(Customer.class));

// 出力
Csv.save(customers, file, cfg, new BeanListHandler<Customer>(Customer.class));

 特定の項目のみを対象としたい場合や、特定の項目のみを非対象としたい場合は次の例のように指定することで可能となります。

// 特定の項目だけ対象とせずに入力(この例ではnameとfullnameを非対象)
List<Customer> customers = Csv.load(file, cfg, new BeanListHandler<Customer>(Customer.class).excludes("name", "fullname"));

// 特定の項目だけ対象として出力(この例ではageとsexのみ対象)
Csv.save(customers, file, cfg, new BeanListHandler<Customer>(Customer.class).includes("age", "sex"));

ColumnNameMappingBeanListHandler

 ColumnNameMappingBeanListHandlerは、BeanListHandlerと同じくPOJOオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。このハンドラは、CSVヘッダ行の項目名とPOJOオブジェクトのフィールド名の対応付け情報をもとに処理します。

// 入力
List<Customer> customers = Csv.load(file, cfg, new ColumnNameMappingBeanListHandler<Customer>(Customer.class));

// 出力
Csv.save(customers, file, cfg, new ColumnNameMappingBeanListHandler<Customer>(Customer.class));

ColumnPositionMappingBeanListHandler

 ColumnPositionMappingBeanListHandlerは、BeanListHandlerと同じくPOJOオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。このハンドラは、CSVヘッダ行の項目位置とPOJOオブジェクトのフィールド名の対応付け情報をもとに処理します。

// 入力
List<Customer> customers = Csv.load(file, cfg, new ColumnPositionMappingBeanListHandler<Customer>(Customer.class));

// 出力
Csv.save(customers, file, cfg, new ColumnPositionMappingBeanListHandler<Customer>(Customer.class));

CsvEntityListHandler

 CsvEntityListHandlerは、CSV用のアノテーションCsvEntityで注釈付けされたPOJOオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。このハンドラは、CSVヘッダ行の項目とPOJOオブジェクトのCsvColumnアノテーションで指定された項目の対応付け情報をもとに処理します。

// 入力
List customers = Csv.load(file, cfg, new CsvEntityListHandler<Customer>(Customer.class));

// 出力
Csv.save(customers, file, cfg, new CsvEntityListHandler<Customer>(Customer.class));

次のページ
まとめ

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
この記事の著者

杉澤 浩二(スギサワ コウジ)

フリーのソフトウェア・アーキテクト / システム・コンサルタント。東京都武蔵野市在住昨今は主に日本国内外を問わず Java プラットフォームでの開発提案・開発支援など。金融・投資のオープンソース・ソフトウェア OrangeSignal のメインコミッターも務める

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4607 2009/12/07 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング