首页 > 解决方案 > 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 很陌生,所以我不确定发生的事情是否是由于缺乏经验(也许有一个我未能检查的设置可以避免这个问题),或者这里是否有其他东西在起作用关于如何文件已读入,但我无法深入了解

标签: javaapache-commons

解决方案


推荐阅读