OpenCSV CsvToBean:UTF-8无BOM格式下第一列未读取

3
使用OpenCSV解析没有BOM的UTF-8文档会导致第一列无法读取。如果以带有BOM的UTF-8编码作为输入,则可以正确地解析相同的文档内容。我已经将字符集明确设置为UTF-8。"最初的回答"
    fileInputStream = new FileInputStream(file);
    inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
    reader = new BufferedReader(inputStreamReader);
    HeaderColumnNameMappingStrategy<Bean> ms = new HeaderColumnNameMappingStrategy<Bean>();
    ms.setType(Bean.class);
    CsvToBean<Bean> csvToBean = new CsvToBeanBuilder<Bean>(reader).withType(Bean.class).withMappingStrategy(ms)
            .withSeparator(';').build();
    csvToBean.parse();

我已经创建了一个示例项目,可以重现该问题:https://github.com/dajoropo/csv2beanSample 运行单元测试,您可以看到没有BOM的UTF-8文件失败了,而有BOM的文件则可以正确运行。
错误出现在第二个断言中,因为第一列未被读取。结果是: [Bean [a=null, b=second, c=third]] 有什么提示吗?

断言失败的是什么 - 解析行数还是它不等于"first"(那它是什么)? - undefined
另外,OpenCSV是开源的。你可以通过使用调试器逐步执行并检查问题所在来进行小规模测试。 - undefined
@AlexanderPavlov 现在问题已经更新,指明了错误。我尝试过对 OpenCSV 进行调试。我发现在 HeaderColumnNameMappingStrategy 的 fieldMap 中,第一列的写入方式有误 = [ ,A] 而不是 [A]。但我不知道为什么会出现这种情况。 - undefined
1个回答

5
如果我在您的项目中打开Bean类并搜索“B”,那么我可以找到一个条目。如果我搜索“A”,则找不到:) 这意味着您把带有BOM标头的“A”复制/粘贴到Bean类中。 BOM标头是不可见的,但仍然会被考虑在内。
如果我修复“A”,那么另一个测试将开始失败,但我认为您可以使用BOMInputStream进行修复。
请查看此问题和答案:Byte order mark screws up file reading in Java 这是已知的问题。 您可以使用Apache Commons IO的BOMInputStream来解决它。
我刚试过。
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

并且

        inputStreamReader = new InputStreamReader(new BOMInputStream(fileInputStream), StandardCharsets.UTF_8);

修复问题

@CsvBindByName(column = "A")
private String a;

将"A"前缀排除掉,这样两个测试都通过。

1
谢谢你的输入!这个库看起来很棒,但是我无法发现它的任何区别。我尝试了创建一个BOMInputStream bomIn = new BOMInputStream(fileInputStream); 并将其作为参数传递给InputStreamReader。我尝试了给出BOM类型或者说排除或包含,还尝试了让bomIn.read()跳过BOM... 但是没有任何效果。可能有一点不太清楚:当没有BOM时,我遇到了读取问题。通常问题出现在存在BOM的情况下。这就是为什么我迄今为止没有找到任何有效的答案。 - undefined
我重新写了答案。你需要修复代码中的拼写错误,并使用BOMInputStream - undefined
疯狂的问题...非常感谢! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接