【问题标题】:Map a CSV element to a list of strings using OpenCsv?使用 OpenCsv 将 CSV 元素映射到字符串列表?
【发布时间】:2020-06-05 00:32:09
【问题描述】:

我有一个由单个空格字符分隔的 CSV 文件,例如 -

<HEADING ROW>
a b c,d,e,f
m n o,p,q

这里,最后一个元素是用逗号分隔符连接的字符串列表。我目前正在使用 OpenCsv 库将此 CSV 文件解析为 POJO 列表。

这是我的 POJO 定义:

import com.opencsv.bean.CsvBindByName;

import java.util.List;

public class Foo {

    @CsvBindByName(column = "heading1", required = true)
    private Long first;

    @CsvBindByName(column = "heading2", required = true)
    private String third;

    @CsvBindByName(column = "heading3", required = true)
    private List<String> fourth;
}

所以这个对象中的所有字段都是不同的类型,尤其是最后一个,它是一个列表类型,并且可以是任何非零长度。 这是我将 CSV 文件映射到这些对象列表的代码:

    public List<Foo> readCsvFromPath(final String filePath) throws IOException {
        try (Reader reader = Files.newBufferedReader(Paths.get(filePath));) {
            CsvToBean<Foo> csvToBean = new CsvToBeanBuilder<Foo>(reader)
                    .withSeparator(' ')
                    .withType(Foo.class)
                    .build();
            return csvToBean.parse();
        }
    }

我不确定的是 CSV 文件的最后一个元素,即“c,d,e,f”或“o,p,q”如何分别映射到 @987654325 之类的列表@ 和{"o", "p", "q"}?

【问题讨论】:

    标签: java csv opencsv


    【解决方案1】:

    您可以使用@CsvBindAndSplitByName

    替换此代码

    @CsvBindByName(column = "heading3", required = true)
    private List<String> fourth;
    

    @CsvBindAndSplitByName(column = "heading3", required = true, elementType = String.class, splitOn = ",")
    private List<String> fourth;
    

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多