gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:57:50 25 4
gpt4 key购买 nike

我正在尝试提取 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com