使用 Apache CSVParser 时如何去掉 header 中的额外引号

How to get rid of extra quotes from the header when using Apache CSVParser

我正在尝试提取 CSV 文件以根据预期值进行验证。但是,读取 header 行时存在问题。具体来说,无论第一列是什么,header 仍然被引用,这会混淆映射。

读取文件的方法如下:

public boolean openCsv(File fileObject) {
    if (fileObject.exists()) {
        try {
            parser = CSVParser.parse(fileObject, StandardCharsets.UTF_8, CSVFormat.RFC4180.withFirstRecordAsHeader().withIgnoreHeaderCase());
            headers = parser.getHeaderMap();
            records = parser.getRecords();

            return true;
        } catch (IOException e) {
            System.out.println("Cannot parse CSV file: " + fileObject.getName());
        }
    }
    return false;
}

问题是,给定的 header:

"Company ID","Company Name","Company Website","Company Phone", ...

header 地图和记录列表将始终保留引用的第一个值:

Error: IllegalArgumentException-Mapping for Company ID not found, expected one of [Company Name, Company Phone, Company Website, ..., "Company ID"]

我尝试遍历 header 并删除引号,但引用的值也是记录映射的一部分,这意味着我必须循环并重建所有内容。

我已经为 CSVParse.parse 尝试了不同的值,但问题仍然存在。

有什么我想念的吗?我检查了 Apache Commons JIRA 板,没有其他人报告过这个问题,所以我倾向于认为这是我需要配置的东西。

由于列因导出而异,我无法对它们进行硬编码并将其传递给解析器。它需要是动态的。

我能够复制类似的问题,如果在 "Company ID" 之前有 space 它被引用(但您可能会注意到 space 在 [=31= 的第一列之前],而且 space 仍将存在于映射中)。

然后我在您的错误消息中注意到一件事:"Company ID" 是映射的最后一个打印元素,即使很难它也应该首先使用字母顺序或 "in file" 顺序。

接着我想起unicode中有一些"invisible"个字符。例如:zero width space, (on wikipedia) 我在 "Company ID" 之前创建了零宽度 space 的测试文件,得到的错误消息与您在问题中显示的错误消息完全相同:

Mapping for Company ID not found, expected one of [Company Name, Company Phone, Company Website, ​"Company ID"] at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:102)

上面的消息中没有中断 space。

顺便说一句,在找到这个之后,我复制了你的错误信息并检查了它是否有不可见字符。 "Company ID".

前面好像有一个 "zero width no break space"

可能您必须解析文件并从中删除此类字符 - 我不知道为什么类似的东西会进入 csv 文件。