JavaのCSVファイルのライブラリ「Super CSV」にアノテーション機能を追加したライブラリ
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 | 他のレコードの値と異なるかハッシュコードにより検証する。 |
@com.github.mygreen.supercsv.annotation.CsvBeanは、CSVのBeanであることを表現するためのアノテーションである。
ヘッダ行無しのCSV Beanを定義する。
@CsvBean(header=false)
public class EmpCsv {
// フィールド定義やgetter/setterの定義
}
@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 で定義したカラム数と異なる場合にスローされる例外 |