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

标签 java csv parsing apache-commons

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

读取文件的方法如下:

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", ...

标题映射和记录列表将始终保留引用的第一个值:

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

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

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

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

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

最佳答案

我能够复制类似的问题,如果在引用“公司 ID”之前有空格(但您可能会注意到标题中第一列之前的空格,而且映射中仍会存在空格)。

然后我注意到您的错误消息中还有一件事:“公司 ID”是映射的最后一个打印元素,即使它应该首先使用字母顺序或“在文件中”顺序也是如此。

接下来我想起了unicode中有一些“不可见”的字符。例如:zero width space , (on wikipedia)我在“公司 ID”之前创建了宽度为零的测试文件,并得到了与您在问题中显示的完全相同的错误消息:

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)

上面的消息中没有分隔符。

顺便说一句,在找到这个之后,我复制了你的错误信息并检查了它是否有不可见字符。似乎有一个 "zero width no break space"在“公司 ID”之前。

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

关于java - 使用 Apache CSVParser 时如何去掉 header 中的额外引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48433483/

相关文章:

regex - Perl - 从文本文件中解析 block

java - 在 JTable 仍处于编辑模式时强制将 "commit"数据建模

java - 如何使用 JOptionPane 和 showMessage Dialog 显示自动垂直滚动条?

java - 使用 maven 创建 JVM 时出错

python - 在 python 中使用 csv.reader 时如何使用多个定界符?

php - 使用数组构建 CSV

java - Android Studio - 如何修复使用 flag_activity_clear_task 后后退按钮仍然有效的问题 | flag_activity_new_task?

c# - 如何通过用户输入(控制台应用程序)使用 C# 中的列表使用 IndexOf 方法自动递增 int userid?

java - 用 Java 解析数百个 pl/sql 文件

c - 在 C 中解析 IRC PRIVMSG