Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenCSV CsvToBean:没有BOM的UTF-8无法读取第一列_Java_Csv_Utf 8_Character Encoding_Opencsv - Fatal编程技术网

Java OpenCSV CsvToBean:没有BOM的UTF-8无法读取第一列

Java OpenCSV CsvToBean:没有BOM的UTF-8无法读取第一列,java,csv,utf-8,character-encoding,opencsv,Java,Csv,Utf 8,Character Encoding,Opencsv,使用OpenCSV解析不带BOM的UTF-8文档会导致第一列未读取。将相同的文档内容作为输入,但使用UTF-8编码,并使用BOM正确工作 我专门将字符集设置为UTF-8 fileInputStream = new FileInputStream(file); inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8); reader = new BufferedRea

使用OpenCSV解析不带BOM的UTF-8文档会导致第一列未读取。将相同的文档内容作为输入,但使用UTF-8编码,并使用BOM正确工作

我专门将字符集设置为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();
fileInputStream=新的fileInputStream(文件);
inputStreamReader=新的inputStreamReader(fileInputStream,StandardCharsets.UTF_8);
reader=新的BufferedReader(inputStreamReader);
HeaderColumnNameMappingStrategy ms=新的HeaderColumnNameMappingStrategy();
ms.setType(Bean.class);
CsvToBean CsvToBean=新的CsvToBeanBuilder(读卡器)。withType(Bean.class)。withMappingStrategy(ms)
.withSeparator(“;”).build();
csvToBean.parse();
我创建了一个示例项目,可以在其中复制该问题:

运行单元测试,您可以看到不带BOM的UTF-8文件如何失败,以及带BOM的UTF-8文件如何正确工作

错误出现在第二个断言中,因为未读取中的第一列。结果是:

[Bean[a=null,b=second,c=third]]


有什么提示吗?

如果我在您的项目中打开
Bean
类并搜索“B”,那么我可以找到一个条目。如果我搜索“A”,那么我就不能:)这意味着你可以将带有BOM头的A复制/粘贴到
Bean
class。BOM表标题不可见,但仍被考虑在内

如果我修复了“A”,那么另一个测试开始失败,但我认为您可以使用
BOMInputStream
修复它

检查这个问题和答案

这是一个众所周知的问题。您可以使用ApacheCommonsIO的
BOMInputStream
来解决这个问题

刚试过

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
修理

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

从“A”中排除前缀会使两个测试都通过

如果我在项目中打开
Bean
类并搜索“B”,那么我可以找到一个条目。如果我搜索“A”,那么我就不能:)这意味着你可以将带有BOM头的A复制/粘贴到
Bean
class。BOM表标题不可见,但仍被考虑在内

如果我修复了“A”,那么另一个测试开始失败,但我认为您可以使用
BOMInputStream
修复它

检查这个问题和答案

这是一个众所周知的问题。您可以使用ApacheCommonsIO的
BOMInputStream
来解决这个问题

刚试过

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
修理

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

从“A”中排除前缀会使两个测试都通过

什么断言失败-解析的行数或它不等于“first”(那么它是什么?)?此外,OpenCSV是开源的。您有一个复制问题的小测试—只需使用调试器进行调试并检查问题所在wrong@AlexanderPavlov现在更新问题,指定错误。我试过调试OpenCSV。我发现HeaderColumnMappingStrategy=[,A]中的fieldMap中的第一列写错了,而不是[A]。但我不知道为什么会发生这种情况。什么断言失败-解析的行数或它不等于“first”(那么它是什么?)?此外,OpenCSV是开源的。您有一个复制问题的小测试—只需使用调试器进行调试并检查问题所在wrong@AlexanderPavlov现在更新问题,指定错误。我试过调试OpenCSV。我发现HeaderColumnMappingStrategy=[,A]中的fieldMap中的第一列写错了,而不是[A]。但我不知道为什么会这样。谢谢你的意见!似乎是一个很棒的图书馆,但我对它没有任何影响。我尝试过创建一个BOMInputStream bomIn=newbominputstream(fileInputStream);并将其作为参数提供给InputStreamReader。我试着给出BOM类型,或者说排除或包含,并使bomIn.read()跳过BOM。。。什么都没用。有一点可能不清楚:当没有BOM时,我会遇到阅读问题。通常问题出现在BOM出现时。这就是为什么到目前为止我没有找到任何有效的答案。我重新写了答案。您必须修复代码中的打字错误并使用
BOMInputStream
疯狂问题。。。非常感谢你!谢谢你的意见!似乎是一个很棒的图书馆,但我对它没有任何影响。我尝试过创建一个BOMInputStream bomIn=newbominputstream(fileInputStream);并将其作为参数提供给InputStreamReader。我试着给出BOM类型,或者说排除或包含,并使bomIn.read()跳过BOM。。。什么都没用。有一点可能不清楚:当没有BOM时,我会遇到阅读问题。通常问题出现在BOM出现时。这就是为什么到目前为止我没有找到任何有效的答案。我重新写了答案。您必须修复代码中的打字错误并使用
BOMInputStream
疯狂问题。。。非常感谢你!