SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

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

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

Csv

 CsvConfigやCsvHandlerを使用して指定されたCSVファイルやストリームへアクセスするCsv統合アクセスユーティリティです。ファイルやストリーム、文字ストリーム(Reader/Writer)の他に、ZIPやLHAといった圧縮形式のファイルやストリームもサポートされています。

// ZIPファイルから読み込み
ZipFile zipFile = new ZipFile(new File("example.zip"));
try {
    List<String[]> list = Csv.load(zipFile, cfg, handler);
} finally {
    zipFile.close();
}

// ZIPファイルへ書き込み
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File("example.zip")));
try {
    // example.csvというエントリ名でZIP圧縮形式へ出力します。
    Csv.save(list, zos, cfg, handler, "example.csv");
} finally {
    zos.close();
}

 特定のZIPエントリのみを対象とする場合はエントリフィルタを使用します。

ZipFile zipFile = new ZipFile(new File("example.zip"));
try {
    // この例では、エントリ名が".csv"で終わるエントリのみを対象とします。
    List<String[]> list = Csv.load(zipFile, cfg, handler, new SuffixEntryNameFilter(".csv"));
} finally {
    zipFile.close();
}

CsvManager

 CsvManagerはPOJOオブジェクトでのCSVアクセスを簡単にするため、Csvユーティリティをより発展させたCSV統合アクセスインターフェースです。CsvManagerはCsvHandlerを内包しており、使用したいマッピング方式によって必要なCsvManagerの実装を使います。

CsvManager 内包するCsvHandler
CsvBeanManager BeanListHandler
CsvColumnNameMappingBeanManager ColumnNameMappingBeanListHandler
CsvColumnPositionMappingBeanManager ColumnPositionMappingBeanListHandler
CsvEntityManager CsvEntityListHandler

CsvFilter

 CsvFilterは、ある条件と一致するCSVデータやPOJOオブジェクトだけを読み込みまたは書き込むためのデータフィルタです。データフィルタはCSVの行データを対象とするものとPOJOオブジェクトを対象にするものの2系統があり、CsvHandlerやCsvManagerで使用します。

データフィルタ 対象
CsvValueFilter CSV行データ
CsvNamedValueFilter CSV行データ
BeanFilter POJOオブジェクト

CsvValueFilter

 CsvValueFilterは、CSVの項目位置で条件を指定するデータフィルタです。CSVの生値である文字列で比較するため高速ですが、書式化された文字列の比較には不向きです。

// CsvHandlerでデータフィルタを使用する例
new StringArrayListHandler()
        .filter(new SimpleCsvValueFilter()
            .in(0, "佐藤", "鈴木")
            .eq(2, "東京都")
        );

// CsvManagerでデータフィルタを使用する例
new CsvColumnPositionMappingBeanManager()
        .load(Customer.class);
        .filter(new SimpleCsvValueFilter()
            .in(0, "佐藤", "鈴木")
            .eq(2, "東京都")
        )
        .offset(0)
        .limit(1000)
        .from(reader);

CsvNamedValueFilter

 CsvNamedValueFilterは、CSVの項目位置または項目名で条件を指定するデータフィルタです。CSVの生値である文字列で比較するため高速ですが、書式化された文字列の比較には不向きです。

// CsvHandlerでデータフィルタを使用する例
new ColumnNameMapListHandler()
        .filter(new SimpleCsvNamedValueFilter()
            .in("姓", "佐藤", "鈴木")
            .eq("都道府県", "東京都")
        );

// CsvManagerでデータフィルタを使用する例
new CsvColumnNameMappingBeanManager()
        .load(Customer.class);
        .filter(new SimpleCsvNamedValueFilter()
            .in("姓", "佐藤", "鈴木")
            .eq("都道府県", "東京都")
        )
        .offset(0)
        .limit(1000)
        .from(reader);

BeanFilter

 BeanFilterは、POJOオブジェクトのフィールド名で条件を指定するデータフィルタです。POJOオブジェクトのフィールド値で比較するので柔軟性がありますが、他2つのデータフィルタほど高速ではありません。

// CsvHandlerでデータフィルタを使用する例
new CsvEntityListHandler<Customer>(Customer.class)
        .filter(new SimpleBeanFilter()
            .in("name", "佐藤", "鈴木")
            .eq("prefecture", "東京都")
            .between("age", 20, 60)
        );

// CsvManagerでデータフィルタを使用する例
new CsvEntityManager()
        .load(Customer.class);
        .filter(new SimpleBeanFilter()
            .in("name", "佐藤", "鈴木")
            .eq("prefecture", "東京都")
            .between("age", 20, 60)
        )
        .offset(0)
        .limit(1000)
        .from(reader);

まとめ

 今回紹介した機能以外にもCsvReaderやCsvWriterなどのローレベルアクセス機能もありますが、本記事では概要編ということで割愛させていただき、公式サイトの説明をなぞる形式で全体をざっくりと説明しました。

 OrangeSignal CSVは「シンプルで機能的」なCSVライブラリということがおわかりいただけたでしょうか。ぜひお試しください。

参考資料

修正履歴

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4607 2009/12/07 14:00

イベント

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

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

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

メールバックナンバー