java - CommonCsv:在使用特定文件时在 record.get 期间出现 IllegalArgException
问题描述
我有以下内容:
StateCountryDataLoader.java
private Map<String, String> getStateCountryMap() throws IOException {
final Map<String, String> stateCountryMap = new HashMap<>();
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(getFile
(filePath)), StandardCharsets.UTF_8));
final CSVParser parser = new CSVParser(reader, CSVFormat.TDF.withHeader("STT_CDE", "CTRY_CDE")
.withSkipHeaderRecord())) {
for(CSVRecord r : parser) {
stateCountryMap.put(r.get("STT_CDE"), getValueOrDefault(r.get("CTRY_CDE")));//get or default is an isNotBlank check. if true, return empty string, otherwise return the value provided to it
}
}
return stateCountryMap;
}
private File getFile(String path) throws IOException {
return new ClassPathResource(path).getFile();
}
当使用的文件如下时,这可以正常工作:
STT.txt
STT_CDE CTRY_CDE
AA USA
AB CAN
AE USA
AK USA
AL USA
AP USA
AR USA
AZ USA
BC CAN
CA USA
CO USA
CT USA
DC USA
DE USA
FL USA
FR
GA USA
GU USA
HI USA
IA USA
ID USA
IL USA
IN USA
KS USA
KY USA
LA USA
MA USA
MB CAN
MD USA
ME USA
MI USA
MN USA
MO USA
MS USA
MT USA
NB CAN
NC USA
ND USA
NE USA
NH USA
NJ USA
NL CAN
NM USA
NS CAN
NT CAN
NU CAN
NV USA
NY USA
OH USA
OK USA
ON CAN
OR USA
PA USA
PE CAN
PR USA
QC CAN
RI USA
SC USA
SD USA
SK CAN
TN USA
TX USA
UT USA
VA USA
VI USA
VT USA
WA USA
WI USA
WV USA
WY USA
YT CAN
在这种情况下,我没有任何问题;record.get 方法的功能与 expeted 一样,即使对于包含空白 CTRY_CDE 值的行也是如此。但是当我使用以下文件时:
样本.txt
STT_CDE CTRY_CDE
AA USA
AB CAN
FR
我得到以下信息:
Caused by: java.lang.IllegalArgumentException: Index for header 'CTRY_CDE' is 1 but CSVRecord only has 1 values!
at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:108)
at com.lmig.ci.fnol.bo.assign.dataload.StateValidValueLoad.getStateCountryMap(StateValidValueLoad.java:83)
etc...
毫无价值,如果我删除 FR 行,那么一切都按预期运行,当我在测试运行后在 Intellij 中打开文件时,FR 之后的选项卡消失了,所以我不确定它是否与我的阅读方式有关是否在文件中,但我看不出问题是什么,因为完整文件中存在同一行,并且任何单元测试或对此方法的调用都不会引发相同的异常。
我对 CommonCsv 很陌生,所以我不确定发生的事情是否是由于缺乏经验(也许有一个我未能检查的设置可以避免这个问题),或者这里是否有其他东西在起作用关于如何文件已读入,但我无法深入了解
解决方案
推荐阅读
- python - 我可以在 Flask 应用程序中使用 python3 类吗?
- python - 我的验证和训练损失不断增加,我是否过度简化了我的网络?
- c - 无法在 C 中打印多行字符串
- r - 从列表中获取计数数据后创建二进制矩阵文件
- python - 与 pygame.sprite.spritecollide() 的敌人碰撞
- mysql - Laravel 从一张表中选择价格最低的独特产品
- powershell - 重命名文件以使用 Powershell 匹配第二个文件夹中的文件
- wordpress - Word Press(终极会员)如何重新排列登录和注册页面中的按钮顺序
- css - 如何增加表格宽度
- pointers - pre ANSI-C“0 指针”应该如何用 ANSI C 编写?