9. ラベルによるカラムのマッピング

カラム番号を指定しないで、ラベルのみよるカラムの定義を用いた読み書きの方法を説明します。 [v2.1+]

ラベルはヘッダー行の値と一致したものとマッピングします。

9.1. Beanの定義

  • ラベルのみによるマッピングは、アノテーション @CsvColumn の属性 number を省略します。

  • フィールド名とCSVのヘッダー行の該当する見出しが異なる場合は、 label で指定します。

  • 従来の属性 number でカラム番号で指定することもできます。

    • 最終的にマッピングする場合、別々なフィールドに対して同じカラムをマッピングするこはできません。

    • 見出しが同じ値の場合は、 number を指定して区別するようにしてください。

コード - 9.1.1 Beanの定義
 1import com.github.mygreen.supercsv.annotation.CsvBean;
 2import com.github.mygreen.supercsv.annotation.CsvColumn;
 3
 4@CsvBean(header=true, validateHeader=true)
 5public class SampleBean {
 6
 7    // ラベルがフィールド名
 8    @CsvColumn
 9    private int no;
10
11    // 従来のカラム番号を指定
12    @CsvColumn(number=2)
13    private String name;
14
15    // ラベルだけ指定
16    @CsvColumn(label="生年月日")
17    @CsvDateTimeFormat(pattern="uuuu/MM/dd")
18    private LocalDate birthday;
19
20    // カラム番号とラベルの両方を指定
21    @CsvColumn(number=4, label="備考")
22    private String comment;
23
24    // getter/setterの定義は省略
25
26}

9.2. 読み込み方法

ラベルによるマッピングを行い読み込むには、 LazyCsvAnnotationBeanReader [ JavaDoc ] を使用します。

  • 全件読み込む場合の使用方法は、基本的に既存の CsvAnnotationBeanReader と変わりません。

  • 1件ずつ読み込む場合は、メソッド LazyCsvAnnotationBeanReader#init() を呼んでマッピング情報を初期化します。

    • 処理内容としては、ヘッダー行を読み込み、それを元にBeanのフィールドとマッピングを行い、カラムの番号を決定します。

    • 全件読み込むメソッド readAll() 内では、メソッド init() が呼ばれているため、初期化が省略することができます。 特に、 readAll() を呼び出す前に、 init() を実行してもかまいません。

コード - 9.2.1 ラベルによるマッピング - 読み込み
 1import com.github.mygreen.supercsv.io.LazyCsvAnnotationBeanReader;
 2
 3import java.nio.charset.Charset;
 4import java.nio.file.Files;
 5import java.io.File;
 6import java.util.ArrayList;
 7import java.util.List;
 8
 9public class Sample {
10
11    // 全レコードを一度に読み込む場合
12    public void sampleReadAll() {
13
14        LazyCsvAnnotationBeanReader<SampleBean> csvReader = new LazyCsvAnnotationBeanReader<>(
15                SampleBean.class,
16                Files.newBufferedReader(new File("sample.csv").toPath(), Charset.forName("Windows-31j")),
17                CsvPreference.STANDARD_PREFERENCE);
18
19        List<SampleBean> list = csvReader.readAll();
20
21        csvReader.close();
22    }
23
24    // レコードを1件ずつ読み込む場合
25    public void sampleRead() {
26
27        LazyCsvAnnotationBeanReader<SampleBean> csvReader = new LazyCsvAnnotationBeanReader<>(
28                SampleBean.class,
29                Files.newBufferedReader(new File("sample.csv").toPath(), Charset.forName("Windows-31j")),
30                CsvPreference.STANDARD_PREFERENCE);
31
32        // ヘッダー行を読み込み初期化します
33        csvReader.init();
34
35        List<SampleBean> list = new ArrayList<>();
36
37        SampleBean record = null;
38        while((record = csvReader.read()) != null) {
39            list.add(record);
40        }
41
42        csvReader.close();
43    }
44}

ヘッダー行が存在しないファイルの場合は、メソッド init("見出し1","見出し2",...) でヘッダー情報を直接指定し、初期化します。 その場合、メソッド readAll() を呼ぶ前にも、直接ヘッダー情報を指定して初期化する必要があります。

コード - 9.2.2 ヘッダー行が存在しないときの読み込み方法
 1import com.github.mygreen.supercsv.io.LazyCsvAnnotationBeanReader;
 2
 3import java.nio.charset.Charset;
 4import java.nio.file.Files;
 5import java.io.File;
 6import java.util.ArrayList;
 7import java.util.List;
 8
 9public class Sample {
10
11    // 全レコードを一度に読み込む場合
12    public void sampleReadAll() {
13
14        LazyCsvAnnotationBeanReader<SampleBean> csvReader = new LazyCsvAnnotationBeanReader<>(
15                SampleBean.class,
16                Files.newBufferedReader(new File("sample.csv").toPath(), Charset.forName("Windows-31j")),
17                CsvPreference.STANDARD_PREFERENCE);
18
19        // ヘッダー情報を指定して初期化します。
20        csvReader.init("no", "name", "生年月日", "備考");
21
22        List<SampleBean> list = csvReader.readAll();
23
24        csvReader.close();
25    }
26
27    // レコードを1件ずつ読み込む場合
28    public void sampleRead() {
29
30        LazyCsvAnnotationBeanReader<SampleBean> csvReader = new LazyCsvAnnotationBeanReader<>(
31                SampleBean.class,
32                Files.newBufferedReader(new File("sample.csv").toPath(), Charset.forName("Windows-31j")),
33                CsvPreference.STANDARD_PREFERENCE);
34
35        // ヘッダー情報を指定して初期化します。
36        csvReader.init("no", "name", "生年月日", "備考");
37
38        List<SampleBean> list = new ArrayList<>();
39
40        SampleBean record = null;
41        while((record = csvReader.read()) != null) {
42            list.add(record);
43        }
44
45        csvReader.close();
46    }
47}

9.3. 書き出し方法

ラベルによるマッピングを行い書き出すには、 LazyCsvAnnotationBeanWriter [ JavaDoc ] を使用します。

  • 全件読み出す場合の使用方法は、基本的に既存の CsvAnnotationBeanWriter と変わりません。

  • 1件ずつ書き出す場合は、メソッド CsvAnnotationBeanWriter#init() を呼んでマッピング情報を初期化します。

    • 処理内容としては、カラムの番号を決定します。カラムの番号は、フィールド名の昇順になります。

    • Beanの定義中にカラム番号を指定しているフィールドと指定していないフィールドが混在する場合、カラム番号が空いているものが利用されます。

    • 全件書き出すメソッド writeAll() 内では、メソッド init() が呼ばれているため、初期化が省略することができます。 特に、 writeAll() を呼び出す前に、 init() を実行してもかまいません。

コード - 9.3.1 ラベルによるマッピング - 書き出し
 1import com.github.mygreen.supercsv.io.LazyCsvAnnotationBeanWriter;
 2
 3import java.nio.charset.Charset;
 4import java.nio.file.Files;
 5import java.io.File;
 6import java.util.ArrayList;
 7import java.util.List;
 8
 9import org.supercsv.prefs.CsvPreference;
10
11public class Sample {
12
13    // 全レコードを一度に書き込む場合
14    public void sampleWriteAll() {
15
16        LazyCsvAnnotationBeanWriter<UserCsv> csvWriter = new LazyCsvAnnotationBeanWriter<>(
17                SampleCsv.class,
18                Files.newBufferedWriter(new File("sample.csv").toPath(), Charset.forName("Windows-31j")),
19                CsvPreference.STANDARD_PREFERENCE);
20
21        // 書き出し用のデータの作成
22        List<SampleCsv> list = new ArrayList<>();
23
24        SampleCsv record1 = new SampleCsv();
25        record1.setNo(1);
26        record1.setName("山田太郎");
27        record1.setBirthday(LocalDate.of(2000, 10, 1));
28        record1.setComment("あいうえお");
29        liad.add(record1);
30
31        SampleCsv record2 = new SampleCsv();
32        record2.setNo(2);
33        record2.setName("鈴木次郎");
34        record2.setBirthday(LocalDate.of(2012, 1, 2));
35        record2.setComment(null);
36        liad.add(record2);
37
38        // ヘッダー行と全レコードデータの書き出し
39        csvWriter.writeAll(list);
40
41        csvWriter.close();
42    }
43
44    // レコードを1件ずつ書き出す場合
45    public void sampleWrite() {
46
47        LazyCsvAnnotationBeanWriter<SampleCsv> csvWriter = new LazyCsvAnnotationBeanWriter<>(
48                UserCsv.class,
49                Files.newBufferedWriter(new File("sample.csv").toPath(), Charset.forName("Windows-31j")),
50                CsvPreference.STANDARD_PREFERENCE);
51
52        // 初期化を行います
53        csvWriter.init();
54
55        // ヘッダー行の書き出し
56        csvWriter.writeHeader();
57
58        // レコードのデータの書き出し
59        SampleCsv record1 = new UserCsv();
60        record1.setNo(1);
61        record1.setName("山田太郎");
62        record1.setBirthday(LocalDate.of(2000, 10, 1));
63        record1.setComment("あいうえお");
64        csvWriter.write(record1);
65
66        SampleCsv record2 = new UserCsv();
67        record2.setNo(2);
68        record2.setName("鈴木次郎");
69        record2.setBirthday(LocalDate.of(2012, 1, 2));
70        record2.setComment(null);
71        csvWriter.write(record2);
72
73        csvWrier.flush();
74        csvWrier.close();
75
76    }
77}

カラム順を独自に指定したい場合、メソッド init("見出し1","見出し2",...) でヘッダー情報を直接指定し、初期化します。 その場合、メソッド writeAll() を呼ぶ前にも、直接ヘッダー情報を指定して初期化する必要があります。

コード - 9.3.2 カラムの順番を指定し書き出す
 1import com.github.mygreen.supercsv.io.LazyCsvAnnotationBeanWriter;
 2
 3import java.nio.charset.Charset;
 4import java.nio.file.Files;
 5import java.io.File;
 6import java.util.ArrayList;
 7import java.util.List;
 8
 9import org.supercsv.prefs.CsvPreference;
10
11public class Sample {
12
13    // 全レコードを一度に書き込む場合
14    public void sampleWriteAll() {
15
16        LazyCsvAnnotationBeanWriter<UserCsv> csvWriter = new LazyCsvAnnotationBeanWriter<>(
17                SampleCsv.class,
18                Files.newBufferedWriter(new File("sample.csv").toPath(), Charset.forName("Windows-31j")),
19                CsvPreference.STANDARD_PREFERENCE);
20
21        // カラムの順番指定して初期化します。
22        csvWriter.init("no", "name", "生年月日", "備考");
23
24        // 書き出し用のデータの作成
25        List<SampleCsv> list = new ArrayList<>();
26        //・・・省略
27
28        // ヘッダー行と全レコードデータの書き出し
29        csvWriter.writeAll(list);
30
31        csvWriter.close();
32    }
33
34    // レコードを1件ずつ書き出す場合
35    public void sampleWrite() {
36
37        LazyCsvAnnotationBeanWriter<SampleCsv> csvWriter = new LazyCsvAnnotationBeanWriter<>(
38                UserCsv.class,
39                Files.newBufferedWriter(new File("sample.csv").toPath(), Charset.forName("Windows-31j")),
40                CsvPreference.STANDARD_PREFERENCE);
41
42        // カラムの順番指定して初期化します。
43        csvWriter.init("no", "name", "生年月日", "備考");
44
45        // ヘッダー行の書き出し
46        csvWriter.writeHeader();
47
48        // レコードのデータの書き出し
49        //・・・省略
50
51        csvWrier.flush();
52        csvWrier.close();
53
54    }
55}