【问题标题】:Apache Commons CSV doesn't ignore missing columnApache Commons CSV 不会忽略缺失的列
【发布时间】:2020-03-23 01:43:18
【问题描述】:

使用 Apache Commons CSV 进行解析,但不会忽略丢失的列并引发异常。

使用此示例数据:

name age
Ali 35
John 25
Vahid 75

下面的代码record.get(DataColumns.surname) 抛出java.lang.IllegalArgumentException: Mapping for surname not found, expected one of [name, surname, age]。我需要它返回 null、可选或默认值。有什么选择吗?我知道record.toMap().get(DataColumns.surname.name()) 可以,但它的性能不会很好:

...
enum DataColumns { name, surname, age }
...
Reader in = new BufferedReader(new FileReader(fileName));

try (CSVParser records = CSVFormat.TDF
                .withDelimiter(' ')
                .withIgnoreSurroundingSpaces()
                .withAllowDuplicateHeaderNames(false)
                .withIgnoreHeaderCase()
                .withTrim()
                .withHeader(DataColumns.class)
                .withFirstRecordAsHeader()
                .withSkipHeaderRecord()
                .withAllowMissingColumnNames(false)
                .withIgnoreEmptyLines()
                .parse(in)) {

   for (CSVRecord record : records) {
       String name = record.get(DataColumns.name);
       String surname = record.get(DataColumns.surname);
       Short age = Short.valueOf(record.get(DataColumns.age)); 
   }
}

...

【问题讨论】:

    标签: java csv apache-commons-csv


    【解决方案1】:

    您可以尝试使用record.isMapped(columnName) 来检查该列是否存在,并记录到一个变量中,这样您就不必再次检查每一行。

    另一种选择是使用records.getHeaderNames() 并将其存储到一个变量中一次,在循环之前,甚至可能使用Set<String> 来获得额外的存在检查性能:Set<String> headerNames = new HashSet<>(records.getHeaderNames())

    然后,您可以通过调用headerNames.contains(columnName) 在循环内使用结果变量来检查列是否存在。

    请看:https://javadoc.io/doc/org.apache.commons/commons-csv/latest/org/apache/commons/csv/CSVRecord.html

    【讨论】:

    • 这没关系,但对于更多列可能会降低性能
    • 一种解决方法是将其返回值存储到第一条记录上的变量中
    • 只检查一次?
    • 完全正确;您可能会在一行或另一行之间丢失单元格,但列名将保持不变
    【解决方案2】:

    有一个方法:record.get(String) 而你给了枚举。

    试试record.get(DataColumns.name.name())

    【讨论】:

    • 请尝试解释你的答案。
    • 它们是一样的,重载方法String get(Enum<?> e)调用String get(String name)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2016-02-25
    相关资源
    最近更新 更多