java - 忽略 csv 中的额外列 - SuperCSV

标签 java supercsv

我正在使用 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/

相关文章:

java - 将 XML 数据发送到 webservices jaxws 的最佳方式是什么

java - map 可以使用 java.text.Collat​​or 吗?

java - 如何在supercsv getHeader中使用编码

Java CSV 读取器/写入器问题

java - 在 Java 时区添加天数东欧夏令时 (EEST)

java - Jackson 中的 JSON 属性文件不区分大小写

java - 序列化期间的竞争条件

java - superCSV java 库内存不足

java - 如何使用 SuperCsv 隔离类的实例?

java - 排除 super csv CsvBeanWriter 中的空字段