簡體   English   中英

Apache Commons CSV 不會忽略缺失的列

[英]Apache Commons CSV doesn't ignore missing column

使用 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] 我需要它返回空值、可選值或默認值。 有什么選擇嗎? 我知道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)); 
   }
}

...

您可以嘗試使用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

有方法:record.get(String) 而你給了枚舉。

試試 record.get(DataColumns.name.name())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM