Apache Commons CSV不会忽略缺少的列

时间:2019-11-27 13:25:12

标签: java csv apache-commons-csv

使用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)); 
   }
}

...

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

有一种方法:当您给枚举时,它是record.get(String)。

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