首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jackson的CSV数据格式模块解析CSV文件的CharConversionException

使用Jackson的CSV数据格式模块解析CSV文件的CharConversionException
EN

Stack Overflow用户
提问于 2015-03-31 21:14:58
回答 2查看 7K关注 0票数 4

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

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

代码语言:javascript
复制
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)
}

这段小代码给了我错误

代码语言:javascript
复制
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读取相同的文件

我试着通过这个错误在互联网上找出,但找不到有用的。有人能告诉我我错过了什么吗?

EN

回答 2

Stack Overflow用户

发布于 2015-04-02 05:55:37

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

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

代码语言:javascript
复制
mapper.readValues(new InputStreamReader(new FileInputStream(csvFile), "ISO-8859-1");

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

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

票数 4
EN

Stack Overflow用户

发布于 2015-05-11 20:59:36

一种在大多数情况下都有效的变通方法是导入Apache Tika并使用AutoDetectReader (参见https://tika.apache.org/1.2/api/org/apache/tika/detect/AutoDetectReader.html)

试试这个:

代码语言:javascript
复制
   //get a file stream in utf format for this file (since they are often not in utf by 
   Charset charset = new AutoDetectReader(new FileInputStream(file)).getCharset();
   String f = FileUtils.readFileToString(file, charset);
   CsvMapper mapper = new CsvMapper();
   CsvSchema schema = CsvSchema.emptySchema().withHeader();
   MappingIterator<Map<String, String>> it = mapper.reader(Map.class).with(schema).readValues(f.getBytes());

在这里,我还使用apache commons将文件转换为字符串。这可以在没有apache commons的情况下完成,只需在google上搜索一下

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29369602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档