====================================== 基本的な使い方 ====================================== ---------------------------- ダウンロード ---------------------------- Mavenを使用する場合は *pom.xml* に以下の記述を追加してください。 .. sourcecode:: xml :linenos: :caption: pom.xmlの依存関係 com.github.mygreen super-csv-annotation 2.3 本ライブラリは、ロギングライブラリ `SLF4j `_ を使用しているため、好きな実装を追加してください。 .. sourcecode:: xml :linenos: :caption: ロギングライブラリの実装の追加(Lobbackの場合) ch.qos.logback logback-classic 1.2.11 test .. sourcecode:: xml :linenos: :caption: logback.xml .%d{HH:mm:ss.SSS} [%thread] %-5level %logger{15} - %msg %n TRACE -------------------------------------- CSV用のBeanクラスの定義 -------------------------------------- CSVの1レコード分をマッピングするためのPOJOクラスを作成します。 * CSV用のクラスは、 ``public`` である必要があります。 * 引数なしの ``public`` なコンストラクタが必要です。 * コンストラクタを定義しない場合は、デフォルトコンストラクタでもかまいません。 * CSV用のクラスであることを示すために、アノテーション ``@CsvBean`` [ `JavaDoc <../apidocs/com/github/mygreen/supercsv/annotation/CsvBean.html>`_ ] をクラスに付与します。 * 属性 ``header`` をtrueとすると、 *CsvAnnotationBeanReader#readAll(...)* と *CsvAnnotationBeanWriter#writeAll(...)* メソッドの呼び出し時に、ヘッダー行がある前提として処理します。 * カラムをフィールドにマッピングするために、アノテーション ``@CsvColumn`` [ `JavaDoc <../apidocs/com/github/mygreen/supercsv/annotation/CsvColumn.html>`_ ]をフィールドに付与します。 * 属性 ``number`` で、マッピングするカラムの番号を指定します。カラムの番号は1から始まります。 * 属性 ``label`` で、ヘッダー行のラベル名を指定することができます。省略した場合はフィールド名が適用されます。 * フィールドに対応するgetter/setterのアクセッサメソッドを作成します。 .. sourcecode:: java :linenos: :caption: Beanクラスのサンプル import com.github.mygreen.supercsv.annotation.CsvBean; import com.github.mygreen.supercsv.annotation.CsvColumn; // レコード用のPOJOクラスの定義 @CsvBean(header=true) public class UserCsv { @CsvColumn(number=1) private int no; @CsvColumn(number=2, label="名前") private String name; // 引数なしのコンストラクタ public UserCsv() { } // 以下、フィールドに対するsetter/getterメソッド public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.naem = name; } } .. note:: アクセッサメソッドを動的に生成する `Lombok `_ を使用すると、コード量を減らすことができます。 -------------------------------------- 読み込み方法 -------------------------------------- * CSVファイルを読み込む場合は、クラス ``CsvAnnotationBeanReader`` [ `JavaDoc <../apidocs/com/github/mygreen/supercsv/io/CsvAnnotationBeanReader.html>`_ ]を使用します。 * 一度に全レコードを読み込む場合は、メソッド ``readAll(...)`` を使用します。 * 1件ずつ読み込む場合は、メソッド ``read(...)`` を使用します。 * Stream API による読み込みを行う場合は、メソッド ``lines(...)`` を使用します。 *[v2.3+]* .. sourcecode:: java :linenos: :caption: 読み込むサンプル import com.github.mygreen.supercsv.io.CsvAnnotationBeanReader; import java.nio.charset.Charset; import java.nio.file.Files; import java.io.File; import java.util.ArrayList; import java.util.List; import org.supercsv.prefs.CsvPreference; public class Sample { // 全レコードを一度に読み込む場合 public void sampleReadAll() { CsvAnnotationBeanReader csvReader = new CsvAnnotationBeanReader<>( UserCsv.class, Files.newBufferedReader(new File("sample.csv").toPath(), Charset.forName("Windows-31j")), CsvPreference.STANDARD_PREFERENCE); List list = csvReader.readAll(); csvReader.close(); } // レコードを1件ずつ読み込む場合 public void sampleRead() { CsvAnnotationBeanReader csvReader = new CsvAnnotationBeanReader<>( UserCsv.class, Files.newBufferedReader(new File("sample.csv").toPath(), Charset.forName("Windows-31j")), CsvPreference.STANDARD_PREFERENCE); List list = new ArrayList<>(); // ヘッダー行の読み込み String headers[] = csvReader.getHeader(true); UserCsv record = null; while((record = csvReader.read()) != null) { list.add(record); } csvReader.close(); } // Stream APIによる読み込む場合 public void sampleReadStream() { CsvAnnotationBeanReader csvReader = new CsvAnnotationBeanReader<>( UserCsv.class, Files.newBufferedReader(new File("sample.csv").toPath(), Charset.forName("Windows-31j")), CsvPreference.STANDARD_PREFERENCE); // ヘッダー行の読み込み String headers[] = csvReader.getHeader(true); List list = new ArrayList<>(); // Streamによる読み込み csvReader.lines().forEach(record -> { list.add(record); }); csvReader.close(); } } -------------------------------------- 書き込み方法 -------------------------------------- * CSVファイルを書き込む場合は、クラス ``CsvAnnotationBeanWriter`` [ `JavaDoc <../apidocs/com/github/mygreen/supercsv/io/CsvAnnotationBeanWriter.html>`_ ]を使用します。 * 一度に全レコードを書き込む場合は、メソッド ``writeAll(...)`` を使用します。 * 1件ずつ書き込む場合は、メソッド ``write(...)`` を使用します。 .. sourcecode:: java :linenos: :caption: 書き込むサンプル import com.github.mygreen.supercsv.io.CsvAnnotationBeanWriter; import java.nio.charset.Charset; import java.nio.file.Files; import java.io.File; import java.util.ArrayList; import java.util.List; import org.supercsv.prefs.CsvPreference; public class Sample { // 全レコードを一度に書き込む場合 public void sampleWriteAll() { CsvAnnotationBeanWriter csvWriter = new CsvAnnotationBeanWriter<>( UserCsv.class, Files.newBufferedWriter(new File("sample.csv").toPath(), Charset.forName("Windows-31j")), CsvPreference.STANDARD_PREFERENCE); // 書き込み用のデータの作成 List list = new ArrayList<>(); UserCsv record1 = new UserCsv(); record1.setNo(1); record1.setName("山田太郎"); liad.add(record1); UserCsv record2 = new UserCsv(); record2.setNo(2); record2.setName("鈴木次郎"); liad.add(record2); // ヘッダー行と全レコードデータの書き込み csvWriter.writeAll(list); csvWriter.close(); } // レコードを1件ずつ書き込む場合 public void sampleWrite() { CsvAnnotationBeanWriter csvWriter = new CsvAnnotationBeanWriter<>( UserCsv.class, Files.newBufferedWriter(new File("sample.csv").toPath(), Charset.forName("Windows-31j")), CsvPreference.STANDARD_PREFERENCE); // ヘッダー行の書き込み csvWriter.writeHeader(); // レコードのデータの書き込み UserCsv record1 = new UserCsv(); record1.setNo(1); record1.setName("山田太郎"); csvWriter.write(record1); UserCsv record2 = new UserCsv(); record2.setNo(2); record2.setName("鈴木次郎"); csvWriter.write(record2); csvWrier.flush(); csvWrier.close(); } } -------------------------------------- 値の加工方法 -------------------------------------- 本ライブラリには、様々なアノテーションが用意されており、:doc:`書式の指定 ` 、:doc:`トリムなどの値の変換 ` 、 :doc:`値の検証 ` を行うことができます。 もちろん、独自のアノテーションを作成することもできます。 また、値を変換するアノテーションと検証を行うアノテーションにおいては、適用順や読み込み/書き込み時に適用するケースを指定する属性がそれぞれ ``order`` 、 ``cases`` にて可能です。 .. sourcecode:: java :linenos: :caption: 値を加工するアノテーションのサンプル import java.time.LocalDate; import com.github.mygreen.supercsv.annotation.CsvBean; import com.github.mygreen.supercsv.annotation.CsvColumn; import com.github.mygreen.supercsv.annotation.constraint.CsvNumberMin; import com.github.mygreen.supercsv.annotation.constraint.CsvRequire; import com.github.mygreen.supercsv.annotation.constraint.CsvUnique; import com.github.mygreen.supercsv.annotation.conversion.CsvDefaultValue; import com.github.mygreen.supercsv.annotation.conversion.CsvNullConvert; import com.github.mygreen.supercsv.annotation.format.CsvDateTimeFormat; import com.github.mygreen.supercsv.annotation.format.CsvNumberFormat; import com.github.mygreen.supercsv.builder.BuildCase; @CsvBean public class SampleCsv { @CsvColumn(number=1, label="ID") @CsvRequire // 必須チェックを行う @CsvUnique(order=1) // 全レコード内で値がユニークか検証する(順番指定) @CsvNumberMin(value="0", order=2) // 下限値以上か検証する(順番指定) private Integer id; @CsvColumn(number=2, label="名前") private String name; @CsvColumn(number=3, label="誕生日") @CsvDateTimeFormat(pattern="yyyy年MM月dd日") // 日時の書式を指定する private LocalDate birthday; @CsvColumn(number=4, label="給料") @CsvNumberFormat(pattern="#,##0") // 数値の書式を指定する @CsvDefaultValue(value="N/A", cases=BuildCase.Write) // 書き込み時に値がnull(空)の場合、「N/A」として出力します。 @CsvNullConvert(value="N/A", cases=BuildCase.Read) // 読み込み時に値が「N/A」のとき、nullとして読み込みます。 private Integer salary; // getter/setterは省略 } -------------------------------------- タブ区切りCSVファイルへの対応 -------------------------------------- 本ライブラリは、CSVの処理はSuper CSVの機能をそのまま使用しているため、 *CsvAnnotationBeanReader/CsvAnnotationBeanWriter* に渡す `CsvPreference `_ をカスタマイズすることで、タブ区切りなどに対応できます。 .. sourcecode:: java :linenos: :caption: CSVの書式を変更するサンプル import com.github.mygreen.supercsv.io.CsvAnnotationBeanReader; import java.nio.charset.Charset; import java.nio.file.Files; import java.io.File; import java.util.ArrayList; import java.util.List; import org.supercsv.prefs.CsvPreference; import org.supercsv.quote.AlwaysQuoteMode; public class Sample { // 書き込む場合 public void sampleWrite() { // CsvPreferencesのカスタマイズ // タブ区切り、改行コード「LF」、必ずダブルクウォートで囲む設定 final CsvPreference preference = new CsvPreference.Builder('\"', '\t', "\n") .useQuoteMode(new AlwaysQuoteMode()) .build(); CsvAnnotationBeanWriter csvReader = new CsvAnnotationBeanWriter<>( UserCsv.class, Files.newBufferedReader(new File("sample.csv").toPath(), Charset.forName("Windows-31j")), preference); // 省略 } }