univocity-parsers を試す

JavaCSVライブラリ多すぎ。

以下の希望で探してきて試してみる。
Needs と Wants ごちゃまぜだけど。

  • CSVファイルをサクッと読み込みたい
  • CSVファイルの出力はしない
  • 読み込んだ内容は JavaBeans にマッピングされて使用できる
  • Bean Validation 機能はあればよい
  • ドキュメント サンプルコードが豊富にある
  • 更新状況はあまり気にしない

前提条件

pom.xml

以下の依存を注入。

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.14</version>
    </dependency>
    <dependency>
        <groupId>com.univocity</groupId>
        <artifactId>univocity-parsers</artifactId>
        <version>2.3.1</version>
    </dependency>
</dependencies>

person.csv

なんちゃって個人情報 にてデータを生成。
プロジェクト配下の src\main\resources に配置。

名前,ふりがな,アドレス,性別,誕生日
脇田 祐基,わきた ゆうき,wakita_yuuki@example.com,男,2017/1/28
今川 広司,いまがわ こうじ,imagawa_kouji@example.com,男,2017/1/9
矢沢 丈史,やざわ たけし,yazawa_takeshi@example.com,男,2017/1/17
...

Persion.java

Java Bean クラスを作成。

package comparison.csvproject.com.univocity;

import com.univocity.parsers.annotations.Parsed;
import lombok.Data;

@Data
public class Persion {

    @Parsed(field = "名前")
    private String name;

    @Parsed(field = "ふりがな")
    private String furigana;

    @Parsed(field = "アドレス")
    private String emailaddress;

    @Parsed(field = "性別")
    private String sex;

    @Parsed(field = "誕生日")
    private String birthday;
}

ExecuteMe.java

実行クラスを作成。

package comparison.csvproject;

import com.univocity.parsers.common.processor.BeanListProcessor;
import com.univocity.parsers.csv.CsvParser;
import com.univocity.parsers.csv.CsvParserSettings;
import java.io.File;
import java.nio.charset.Charset;
import java.util.List;

public class ExecuteMe {

    public static void main(String[] args) {
        ExecuteMe me = new ExecuteMe();
        me.comunivocity();
    }

    public void comunivocity() {

        BeanListProcessor<comparison.csvproject.com.univocity.Persion> processor
                = new BeanListProcessor<>(comparison.csvproject.com.univocity.Persion.class);

        CsvParserSettings parserSettings = new CsvParserSettings();
        parserSettings.setProcessor(processor);
        parserSettings.setHeaderExtractionEnabled(true);

        File file = new File(ClassLoader.getSystemResource("person.csv").getFile());

        CsvParser parser = new CsvParser(parserSettings);
        parser.parse(file, Charset.forName("Shift_JIS"));

        List<comparison.csvproject.com.univocity.Persion> beans = processor.getBeans();
        for (comparison.csvproject.com.univocity.Persion bean : beans) {
            System.out.println(bean);
        }
    }
}

出力

できた。
素晴らしい。

Persion(name=脇田 祐基, furigana=わきた ゆうき, emailaddress=wakita_yuuki@example.com, sex=男, birthday=2017/1/28)
Persion(name=今川 広司, furigana=いまがわ こうじ, emailaddress=imagawa_kouji@example.com, sex=男, birthday=2017/1/9)
Persion(name=矢沢 丈史, furigana=やざわ たけし, emailaddress=yazawa_takeshi@example.com, sex=男, birthday=2017/1/17)
...

比較

以下も軽く試してみたが univocity-parsers に分がある。

OrangeSignal CSV

チュートリアル通りにやってもできない。
実行時の挙動がおかしい。
IndexOutOfBoundsException が発生する。
もしかして Java8 に対応していない?
GitHub上にコードはあるが...。

Super CSV Annotation

さくと動いた。
ただアノテーションで position 指定なのが頂けない。
CSVの順番が変わった時に影響を受けることになる。
univocity-parsers はヘッダ列から柔軟にマッピングしてくれるので、そっちが良い。