我正在使用SuperCSV将CSV记录解析为对象。我的CSV文件末尾有多余的列,我只想处理前X列。因此,我为前X个列和相同大小的String[]定义了CellProcessor[]映射。但是它似乎不起作用,并且引发异常,即单元处理器的数量应与列数完全相同。

有人可以告诉我我是否想念一些东西。我是否需要将映射数组定义为与五列完全相同的列,即使我不希望它们也是如此?

  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文件的标题用作nameMapping,则无需知道有多少列,只需使用它们即可。如果它们不适合映射(它们的名称与bean中的setter不对应),则需要为自己的nameMapping提供正确数量的元素。

如果您的CSV文件有一个标头,并且您知道只需要前两列,则只需提供一个与标头大小相同的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...

10-04 18:55