我有一个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 "如何能分别映射到列表中去,如 {"c", "d", "e", "f"}
和 {"o", "p", "q"}
?
你可以使用 @CsvBindAndSplitByName
.
替换
@CsvBindByName(column = "heading3", required = true)
private List<String> fourth;
与
@CsvBindAndSplitByName(column = "heading3", required = true, elementType = String.class, splitOn = ",")
private List<String> fourth;