我正在尝试使用CSV Jackson来解析CSV 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来读取相同的文件 我试图在互联网上找出这个错误,但找不到有用的东西。请有人告诉我缺少什么?
答案 0 :(得分:2)
您很可能正在阅读不是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编码中的可打印字符。
答案 1 :(得分:1)
在大多数情况下可以使用的解决方法是导入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将文件转换为String。这可以在没有apache commons的情况下完成,只需google it