2015-03-31 81 views
0

我想用Jackson的的CSV data format module解析CSV文件。使用Jackson的CSV数据格式模块解析CSV文件中的CharConversionException

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

回答

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编码(大多数?)中的可打印字符。

+0

我相信在我的文件没有不可打印或特殊字符。我可以使用'openCVS'来读取我的文件。 – 2015-04-10 10:42:36

+0

如果你有一个触发这个文件的示例文件,最好在(https://github.com/FasterXML/jackson-dataformat-csv/)上提交一个错误报告。问题/)。 – StaxMan 2015-04-10 19:58:45

1

一种解决方法,这将在大多数情况下是导入Apache的蒂卡和使用AutoDetectReader(见)

试试这个:

//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公共,只是谷歌它