java - 使用 Jackson 的 CSV 数据格式模块解析 CSV 文件时出现 CharConversionException

标签 java csv jackson jackson-modules

我正在尝试解析 CSV文件使用 JacksonCSV data format module .

我尝试了在他们的项目主页 (https://github.com/FasterXML/jackson-dataformat-csv) 上给出的示例代码

CsvMapper mapper = new CsvMapper();
mapper.enable(CsvParser.Feature.WRAP_AS_ARRAY);
File csvFile = new File("input.csv");
MappingIterator<String[]> it =  mapper.reader(String[].class).readValues(csvFile);
while (it.hasNext()) {
    String[] row = it.next();
    System.out.println(row)
}

这个小代码给我错误

Exception in thread "main" java.io.CharConversionException: Invalid UTF-8 start byte 0x92 (at char #269, byte #-1)
at com.fasterxml.jackson.dataformat.csv.impl.UTF8Reader.reportInvalidInitial(UTF8Reader.java:393)
at com.fasterxml.jackson.dataformat.csv.impl.UTF8Reader.read(UTF8Reader.java:245)
at com.fasterxml.jackson.dataformat.csv.impl.CsvReader.loadMore(CsvReader.java:438)
at com.fasterxml.jackson.dataformat.csv.impl.CsvReader.hasMoreInput(CsvReader.java:475)
at com.fasterxml.jackson.dataformat.csv.CsvParser._handleStartDoc(CsvParser.java:461)
at com.fasterxml.jackson.dataformat.csv.CsvParser.nextToken(CsvParser.java:414)
at com.fasterxml.jackson.databind.ObjectReader._bindAndReadValues(ObjectReader.java:1492)
at com.fasterxml.jackson.databind.ObjectReader.readValues(ObjectReader.java:1335)
at com.til.etwealth.etmoney.util.alok.main(alok.java:18)  

我可以使用 openCSV 读取相同的文件
我试图通过互联网上的这个错误找出答案,但找不到有用的东西。请有人告诉我我错过了什么?

最佳答案

您阅读的内容很可能不是 UTF-8 编码,而是使用其他编码,例如 Latin-1 (ISO-8859-1)。 我认为您收到的错误消息不是很好,所以也许可以改进以提出可能的原因,因为这是相对常见的问题。

要读取非 Unicode 编码,您需要自己构造 Reader(因为不可能可靠地自动检测差异——尽管可能有 Java 库可以使用启发式方法来尝试自动确定):

mapper.readValues(new InputStreamReader(new FileInputStream(csvFile), "ISO-8859-1");

或者,无论用于对文件进行编码的是什么,都应指定要使用的 UTF-8 编码。

还有其他可能的原因(例如文件截断),但字符编码不匹配是一个常见的原因。这里的主要奇怪之处实际上是那个特定的字符代码,它不是(大多数?)ISO-8859-x 编码中的可打印字符。

关于java - 使用 Jackson 的 CSV 数据格式模块解析 CSV 文件时出现 CharConversionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29369602/

相关文章:

java - 自定义StdDeserializer不使用指定的@JsonView

java - 使用 Jackson 序列化自定义 map

java - jackson 本地日期 : one day off during serialization

python - 将函数的结果写入 csv 中

java - 如何使用j2html创建表?

java - 在 Windows 上使用 JDK 1.4 监控 Tomcat 5.5

java - 如何添加不重新编译就无法删除的过滤器/AOP方法?

python - python 中 csv 文件的 wordcloud

python - 通过 python 将 csv 文件插入 MySQL。运行但数据未填充到表中

java - 线程 "main"java.lang.AbstractMethodError 中的异常 - Spring Boot 应用程序