【问题标题】:CharConversionException in parsing CSV file using Jackson's CSV data format module使用 Jackson 的 CSV 数据格式模块解析 CSV 文件时出现 CharConversionException
【发布时间】:2015-03-31 13:14:58
【问题描述】:

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

我尝试了他们项目主页上给出的示例代码 (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读取相同的文件
我试图通过互联网上的这个错误找出答案,但找不到有用的。请有人告诉我错过了什么?

【问题讨论】:

    标签: java csv jackson jackson-modules


    【解决方案1】:

    您阅读的内容很可能不是 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 编码中的可打印字符。

    【讨论】:

    【解决方案2】:

    在大多数情况下可行的解决方法是导入 Apache Tika 并使用 AutoDetectReader(请参阅 https://tika.apache.org/1.2/api/org/apache/tika/detect/AutoDetectReader.html

    试试这个:

       //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 即可

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2018-12-11
      • 1970-01-01
      相关资源
      最近更新 更多