OpenCSV - 如何将选定的列映射到 Java Bean 而不考虑顺序?

2022-09-01 11:52:47

我有一个包含以下列的 CSV 文件:、 、 、 、 。idfnametelephonelnameaddress

我有一个包含 和 数据成员的类。我只想将这些列映射到CSV文件中的对象,并丢弃和列。我该怎么做?该解决方案必须随着将来添加更多列而扩展。并且无论列位置如何,都应该工作。PersonidfnamelnamePersontelephoneaddress

在理想的解决方案中,用户只会指定要读取的列,它应该可以正常工作。


答案 1

您可以使用 HeaderColumnNameTranslateMappingStrategy。为了简单起见,假设您的 CSV 具有以下列:、、。IdFnameTelephoneLnameAddress

CsvToBean<Person> csvToBean = new CsvToBean<Person>();

Map<String, String> columnMapping = new HashMap<String, String>();
columnMapping.put("Id", "id");
columnMapping.put("Fname", "fname");
columnMapping.put("Lname", "lname");

HeaderColumnNameTranslateMappingStrategy<Person> strategy = new HeaderColumnNameTranslateMappingStrategy<Person>();
strategy.setType(Person.class);
strategy.setColumnMapping(columnMapping);

List<Person> list = null;
CSVReader reader = new CSVReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("test.csv")));
list = csvToBean.parse(strategy, reader);

列映射会将列与对象进行映射。Person


答案 2

OpenCSV的最新版本弃用了该方法,并重新开始使用BeanBuilder,因此最重要的答案已经过时了。parse(X, Y)

try {
    CsvToBeanBuilder<PersonCSV> beanBuilder = new CsvToBeanBuilder<>(new InputStreamReader(new FileInputStream("your.csv")));

    beanBuilder.withType(PersonCSV.class);
    // build methods returns a list of Beans
    beanBuilder.build().parse().forEach(e -> log.error(e.toString()));

} catch (FileNotFoundException e) {
    log.error(e.getMessage(), e);
}

此方法允许您清理代码并删除MapingStrategy(如果您喜欢意大利面条,您仍然可以使用它),因此您可以按如下方式注释CSV类:

@CsvDate("dd/MM/yyyy hh:mm:ss")
@CsvBindByName(column = "Time Born", required = true)
private Date birthDate;