解析CSV时出现ZWNBSP

问题描述 投票:0回答:3

我有一个 CSV,我想检查它是否包含应有的所有数据。但看起来 ZWNBSP 出现在第一个字符串中第一个列名称的开头。

我的简化代码是

@Test
void parseCsvTest() throws Exception {
    Configuration.holdBrowserOpen = true;
    ClassLoader classLoader = getClass().getClassLoader();
    try (
            InputStream inputStream = classLoader.getResourceAsStream("files/csv_example.csv");
            CSVReader reader = new CSVReader(new InputStreamReader(inputStream))
    ) {
        List<String[]> content = reader.readAll();
        var csvStrings0line = content.get(0);
        var csv1stElement = csvStrings0line[0];
        var csv1stElementShouldBe = "Timestamp";
        assertEquals(csv1stElementShouldBe,csv1stElement);

我的 CSV 包含

"Timestamp","Source","EventName","CountryId","Platform","AppVersion","DeviceType","OsVersion"
"2022-05-02T14:56:59.536987Z","courierapp","order_delivered_sent","643","ios","3.11.0","iPhone 11","15.4.1"
"2022-05-02T14:57:35.849328Z","courierapp","order_delivered_sent","643","ios","3.11.0","iPhone 8","15.3.1"

我的测试失败了

expected: <Timestamp> but was: <Timestamp>
Expected :Timestamp
Actual   :Timestamp
<Click to see difference>

点击查看差异显示实际文本的开头有一个 ZWNBSP。

将我的文本复制粘贴到在线工具中以显示不可打印的 unicode 字符https://www.soscisurvey.de/tools/view-chars.php仅在行尾显示 CR LF,没有 ZWNBSP。

但是它从哪里来?

java csv junit special-characters
3个回答
5
投票

这是一个 BOM 字符。您可以自行删除它或使用其他几种解决方案(例如,请参阅https://stackoverflow.com/a/4897993/1420794


2
投票

那是 Unicode 零宽度不间断空格字符。当在 Unicode 编码文本文件的开头使用时,它充当“字节顺序标记”。您可以阅读它来确定文本文件的编码,然后您可以根据需要安全地丢弃它。您能做的最好的事情就是传播意识。


0
投票

自 SmarterCSV 1.8.0 版本以来,BOM 字符问题已得到修复

要查看文件的十六进制转储,此命令可以帮助调试此类问题:

hexdump -C your-file.csv

© www.soinside.com 2019 - 2024. All rights reserved.