代码之家  ›  专栏  ›  技术社区  ›  MivaScott

如何在使用Apache CSVParser时去掉标头中的额外引号

  •  4
  • MivaScott  · 技术社区  · 7 年前

    我正在尝试拉入一个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;
    }
    

    问题是,对于给定的标头:

    “公司ID”、“公司名称”、“公司网站”、“公司电话”、。。。

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

    错误:未找到公司ID的IllegalArgumentException映射,应为[公司名称、公司电话、公司网站,…,ï»?“公司ID”]

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

    我尝试了CSVParse的不同值。解析,但问题仍然存在。

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

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Kamil Piwowarski    7 年前

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

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

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

    找不到公司ID的映射,应为[公司名称、公司电话、公司网站、–Company ID“] 位于组织。阿帕奇。平民csv。CSVRecord公司。get(CSVRecord.java:102)

    上述消息中存在无中断空间。

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

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