gpt4 book ai didi

java - 跳过格式错误的 csv 行

转载 作者:搜寻专家 更新时间:2023-10-31 20:01:09 25 4
gpt4 key购买 nike

我一直在尝试读取 csv 并将字段添加到数据结构。但是,其中一排的格式不正确,我知道这一点。我只想跳过这一行,转到另一行。但是,即使我正在捕获异常,它仍然打破了循环。知道我在这里缺少什么吗?

我的 csv:

"id","name","email"
121212,"Steve","steve@example.com"
121212,"Steve","steve2@example.com",,
121212,"Steve","steve@example.com"

我的代码:

import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;

public static void main(String[] args) throws Exception{
Path path = Paths.get("list2.csv");
CsvMapper mapper = new CsvMapper();
CsvSchema schema = CsvSchema.emptySchema().withHeader();
MappingIterator<Object> it = mapper.reader(Object.class)
.with(schema)
.readValues(path.toFile());

try{
while(it.hasNext()){
Object row;
try{
row = it.nextValue();
} catch (IOException e){
e.printStackTrace();
continue;
}
}
} catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}

}

异常:

com.fasterxml.jackson.core.JsonParseException: Too many entries: expected at most 3 (value #3 (0 chars) "")
at [Source: java.io.InputStreamReader@12b3519c; line: 3, column: 38]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1486)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:518)
at com.fasterxml.jackson.dataformat.csv.CsvParser._handleNextEntryExpectEOL(CsvParser.java:601)
at com.fasterxml.jackson.dataformat.csv.CsvParser._handleNextEntry(CsvParser.java:587)
at com.fasterxml.jackson.dataformat.csv.CsvParser.nextToken(CsvParser.java:474)
at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.mapObject(UntypedObjectDeserializer.java:592)
at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserialize(UntypedObjectDeserializer.java:440)
at com.fasterxml.jackson.databind.MappingIterator.nextValue(MappingIterator.java:188)
at CSVTest.main(CSVTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
java.lang.ArrayIndexOutOfBoundsException: 3
at com.fasterxml.jackson.dataformat.csv.CsvSchema.column(CsvSchema.java:941)
at com.fasterxml.jackson.dataformat.csv.CsvParser._handleNamedValue(CsvParser.java:614)
at com.fasterxml.jackson.dataformat.csv.CsvParser.nextToken(CsvParser.java:476)
at com.fasterxml.jackson.databind.MappingIterator.hasNextValue(MappingIterator.java:158)
at CSVTest.main(CSVTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

最佳答案

使用 Jackson 2.6 处理 readValues()已得到改进以尝试从处理错误中恢复,这样在许多情况下您可以再试一次,以读取以下有效行。所以确保至少使用版本 2.6.2 .

较早的版本也没有恢复,通常使其余内容无法处理;这可能就是您的情况。

另一种可能性,假设您的问题不是无效的 CSV,而是不可映射为 POJO(至少 POJO 定义的方式),是将内容读取为 String[] 的序列,并手动处理映射。 Jackson 的 CSV 解析器本身不介意任何数量的列,它是更高级的数据绑定(bind),它喜欢查找它无法识别的“额外”内容。

关于java - 跳过格式错误的 csv 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32752245/

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