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]
。我需要它 returns 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));
}
}
...
您可以尝试使用 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())
使用 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]
。我需要它 returns 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));
}
}
...
您可以尝试使用 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())