【发布时间】:2018-07-04 03:32:51
【问题描述】:
我正在尝试提取 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-Mapping,应为 [公司名称、公司电话、公司网站、...、“公司 ID”] 之一
我尝试循环遍历标题并删除引号,但引用的值也是记录映射的一部分,这意味着我必须循环并重建所有内容。
我为 CSVParse.parse 尝试了不同的值,但问题仍然存在。
我有什么遗漏吗?我检查了 Apache Commons JIRA 板,没有其他人报告过这个问题,所以我倾向于认为这是我需要配置的东西。
由于列因导出而异,我无法对它们进行硬编码并将其传递给解析器。它需要是动态的。
【问题讨论】:
-
从您的错误消息看来,情况正好相反。
Mapping for Company ID not found(公司 ID 周围没有引号);expected one of ... "Company ID"](引用)。所以它期望引用的版本,但得到未引用的版本? -
@Vasan,请注意,没有其他标题有引号。它只是保留引号的行中的第一个。所以如果我寻找“公司名称”带引号,它会失败。我真的不在乎所有标题是否都有引号,但它必须是一致的。由于可导出的字段是用户配置的,我无法知道第一列的名称。虽然我可能可以用 try/catch 破解一些东西,但 if/else 由于一个异常,它似乎需要做很多工作。
-
您使用哪个版本的库?您能否向我们展示您使用标头的部分代码? (例如,从行中读取一些字段)
-
我没有得到相同的结果,没有任何额外的引号适合我。什么代码发出错误消息?我不相信该消息来自 Commons CSV,它必须来自其他代码。请edit您的帖子并包含完整的堆栈跟踪(包括所有引起的部分、代码格式)并准确指出哪个 Java 语句引发了异常。
标签: java csv parsing apache-commons