使用 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 文件。
我正在尝试提取 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 文件。