我有以下内容:
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
在这种情况下,我没有问题;即使对于包含空白CTRY_CDE值的行,record.get方法也可以发挥作用。但是当我使用以下文件时:
sample.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的新手,所以我不确定发生的原因是否是由于经验不足(也许我无法检查某个设置来避免此问题),或者是否有其他原因在起作用这里是关于如何读取文件的信息,但我无法深入了解