使用Apache CSVParser

时间:2018-01-24 23:41:39

标签: 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;
}

问题是,给定标题:

  

“公司ID”,“公司名称”,“公司网站”,“公司电话”,......

标题地图和记录列表将始终保留第一个值为quoted:

  

错误:IllegalArgumentException - 未找到公司ID的映射,预期的[公司名称,公司电话,公司网站,......,“公司ID”]

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

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

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

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

1 个答案:

答案 0 :(得分:3)

我能够复制类似的问题,如果之前有空格"公司ID"它被引用(但你可能会注意到标题中第一列之前的空格,这个空间仍然会出现在映射中)。

然后我在你的错误信息中又注意到了一件事:"公司ID"是映射的最后一个打印元素,即使很难,它应该首先使用字母或"在文件"顺序。

接下来我记得有一些"隐形" unicode中的字符。例如:zero width space(on wikipedia)我在"公司ID"之前创建了零宽度空间的测试文件,并且得到了与您在问题中显示的完全相同的错误消息:

  

未找到公司ID的映射,预期的[公司名称,公司电话,公司网站,"公司ID"]       在org.apache.commons.csv.CSVRecord.get(CSVRecord.java:102)

上面的消息中没有中断空格。

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

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