Super CSV Annotation

JavaのCSVファイルのライブラリ「Super CSV」にアノテーション機能を追加したライブラリ

Maven

MavenプロジェクトでSuper CSV Annotationを使うには、pom.xmlに依存関係を次のように記述する。

<dependency>
  <groupId>com.github.mygreen</groupId>
  <artifactId>super-csv-annotation</artifactId>
  <version>2.1</version>
</dependency>

Super CSV Annotationはロギングライブラリ「SLF4J (Simple Logging Facade for Java)」を使っているため、SLF4Jの実装も依存関係に追加する必要がある。

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.1</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.14</version>
</dependency>

サンプル

Apache Commons CSVでCSVファイルを読み込むサンプルを示す。

package com.fc2web.itref.examples.supercsv;

import com.github.mygreen.supercsv.annotation.CsvBean;
import com.github.mygreen.supercsv.annotation.CsvColumn;

@CsvBean(header=false)
public class EmpCsv {

  /** 社員番号 */
  @CsvColumn(number=1)
  private int empno;

  /** 氏名 */
  @CsvColumn(number=2)
  private String ename;

  /** コンストラクタ */
  public EmpCsv() {

  }

  /**
   * 社員番号の取得
   *
   * @return 社員番号
   */
  public int getEmpno() {
      return empno;
  }

  /**
   * 社員番号の設定
   *
   * @param empno 社員番号
   */
  public void setEmpno(int empno) {
      this.empno = empno;
  }

  /**
   * 氏名の取得
   *
   * @return 氏名
   */
  public String getEname() {
      return ename;
  }

  /**
   * 氏名の設定
   *
   * @param ename 氏名
   */
  public void setEname(String ename) {
      this.ename = ename;
  }
}
package com.fc2web.itref.examples.supercsv;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.List;

import org.supercsv.prefs.CsvPreference;

import com.github.mygreen.supercsv.io.CsvAnnotationBeanReader;

public class SuperCsvExamples {

  public static void main(String[] args) {
      File file = new File("C:\\\\Users\\\\tsuka\\\\Documents\\\\example.csv");
      try {
          BufferedReader br = Files.newBufferedReader(file.toPath(), Charset.forName("Windows-31j"));
          CsvAnnotationBeanReader<EmpCsv> csvReader = new CsvAnnotationBeanReader<EmpCsv>(EmpCsv.class, br, CsvPreference.STANDARD_PREFERENCE);
          // すべてのレコードを一度に読み込む
          List<EmpCsv> list = csvReader.readAll();
          for (EmpCsv empCsv : list) {
              System.out.println(empCsv.getEmpno());
              System.out.println(empCsv.getEname());
          }
          csvReader.close();
          br.close();
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
}

上記のプログラムの実行結果を示す。

1
Muto Ayami
2
Miyoshi
3
Matsui Airi

アノテーション

Super CSV Annotationのアノテーション(注釈型)を次に示す。

アノテーション 説明
@com.github.mygreen.supercsv.annotation.CsvBean CSVのBeanであることを表現するためのアノテーション
@com.github.mygreen.supercsv.annotation.CsvColumn CSVのカラムであることを表現するためのアノテーション
@com.github.mygreen.supercsv.annotation.constraint.CsvEquals 指定した値と等しいか検証する。
@com.github.mygreen.supercsv.annotation.constraint.CsvRequire 必須チェックを行う。
@com.github.mygreen.supercsv.annotation.constraint.CsvUnique 他のレコードの値と異なるか検証する。
@com.github.mygreen.supercsv.annotation.constraint.CsvUniqueHashCode 他のレコードの値と異なるかハッシュコードにより検証する。

@CsvBean

@com.github.mygreen.supercsv.annotation.CsvBeanは、CSVのBeanであることを表現するためのアノテーションである。

ヘッダ行無しのCSV Beanを定義する。

@CsvBean(header=false)
public class EmpCsv {
  // フィールド定義やgetter/setterの定義
}

@CsvColumn

@com.github.mygreen.supercsv.annotation.CsvColumnは、CSVのカラムであることを表現するためのアノテーションである。

カラム番号(1始まり)を指定してカラムを定義する。

@CsvColumn(number=1)
private int empno;

カラム番号と見出しの値を指定してカラムを定義する。

@CsvColumn(number=2, label="EmployeeName")
private String ename;

例外

Super CSV Annotationがスローする例外を次の表に示す。

例外 説明
com.github.mygreen.supercsv.exception.SuperCsvNoMatchColumnSizeException ヘッダー行やレコードを読み込む際に@CsvColumnで定義したカラム数と異なる場合にスローされる例外