gpt4 book ai didi

java - Apache Commons CSV 不会忽略缺失的列

转载 作者:行者123 更新时间:2023-11-30 05:23:43 30 4
gpt4 key购买 nike

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

使用此示例数据:

name age
Ali 35
John 25
Vahid 75

下面的代码record.get(DataColumns.surname)抛出java.lang.IllegalArgumentException:找不到姓氏映射,需要[姓名,姓氏,年龄]之一 。我需要它返回 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

关于java - Apache Commons CSV 不会忽略缺失的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59071253/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com