OpencsvでJava BeansとMappingする

Opencsvについては、リンク先を参照。
ここではアノテーションを使わずに、各列を各変数にマッピングする方法を紹介する。

・CSVを読み込む

try (InputStreamReader is = new InputStreamReader(multipartFile.getInputStream(), Constants.ENCODING);
        CSVReader reader = new CSVReaderBuilder(is).withSkipLines(1).build()) {
    ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy<>();
    strat.setType(User.class);
    strat.setColumnMapping("username", "password", "firstName", "lastName", "email");

    CsvToBean<User> csv = new CsvToBean<>();
    csv.setCsvReader(reader);
    csv.setMappingStrategy(strat);
    return csv.parse();
} catch (IOException e) {
    // 適宜例外処理
} catch (IllegalStateException e) {
    // 適宜例外処理
}

InputStreamReaderについては、どこからファイルを取得するかによって変更する。

CSVReader reader = new CSVReaderBuilder(is).withSkipLines(1).build();

で、CSVReaderを作成する。1行目はヘッダー行のため、withSkipLines(1)で2行目から読み込むようにしている。

ColumnPositionMappingStrategyで、CSVファイルの各列をどのクラスのどの変数にマッピングするか指定出来る。
strat.setType(User.class)で、Userクラスにマッピングすることを指定している。
strat.setColumnMapping(“username”, “password”, “firstName”, “lastName”, “email”)で、1列目をUserクラスのusername変数へ、2列目をpasswordへのように指定していることになる。

CsvToBeanで、List<String[]>をList<User>に変換する。

・CSVに書き出す

try (OutputStreamWriter os = new OutputStreamWriter(response.getOutputStream(), Constants.ENCODING);
        CSVWriter writer = new CSVWriter(os)) {
    // ヘッダー行を追加
    writer.writeNext(new String[] {"ユーザ名","パスワード","名字","名前","eメール"});

    ColumnPositionMappingStrategy<User> strat = new ColumnPositionMappingStrategy<>();
    strat.setType(User.class);
    strat.setColumnMapping("username", "password", "firstName", "lastName", "email");

    StatefulBeanToCsv<User> beanToCsv = new StatefulBeanToCsvBuilder<User>(writer)
        .withMappingStrategy(strat)
        .build();
    beanToCsv.write(userList);
} catch (IOException e) {
    // 適宜例外処理
} catch (CsvException e) {
    // 適宜例外処理
}

CSVファイルへの書き出しは上記の通り。