我正在使用 SuperCSV 将 CSV 记录解析为对象。我的 CSV 文件最后有额外的列,我只想处理前 X 列。因此,我为前 X 列和相同大小的 CellProcessor[]
定义了 String[]
映射。但它似乎不起作用并引发异常,即单元处理器的数量应与列数完全相同。
有人可以告诉我我是否遗漏了什么吗?即使我不想要它们,我是否需要定义映射数组以使其具有与五个完全相同的列?
public CsvToBeanParser(Reader reader, Class<T> type, CsvPreference preference, CellProcessor[] cellProcessors, String[] mapping, boolean skipHeader)
throws IOException {
this.beanReader = new CsvBeanReader(reader, preference);
this.mapping = mapping;
if (skipHeader) {
beanReader.getHeader(true);
}
this.cellProcessors = cellProcessors;
this.type = type;
}
/**
* Parse and return record.
*
* @return
* @throws Exception
* if there is any parsing error
*/
public T getItem() throws Exception {
try {
return (T) beanReader.read(type, mapping, cellProcessors);
} catch (Exception e) {
LOG.error("Error parsing record", e);
throw e;
}
}
这是我的映射和单元处理器
String[] mapping = {"column1", "column2"};
CellProcessor[] cellProcessors = {null, null};
这适用于文件
column1, column2
1,2
但失败(我想忽略 column3 )
column1, column2, column3
1,2,3
最佳答案
如果您使用 CSV 文件的 header 作为 nameMapping
,那么您永远不需要知道有多少列,只需使用它们即可。如果它们不适合映射(它们的名称与您的 bean 中的 setter 不对应),那么您需要为您自己的 nameMapping
提供正确数量的元素。
如果您的 CSV 文件有标题,并且您知道您只需要前 2 列,那么您可以简单地提供一个与标题大小相同的 nameMapping 数组(以及可选的单元处理器数组),但只包含填充前 2 个元素。
String[] header = beanReader.getHeader(true);
// only interested in first 2 columns (rest set to null)
String[] nameMapping =
Arrays.copyOf(new String[]{"column1","column2"}, header.length);
// processors are optional, but you can populate these if you want
CellProcessor[] processors = new CellProcessor[header.length];
// TODO: read your CSV here...
关于java - 忽略 csv 中的额外列 - SuperCSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099687/