У меня есть следующее:
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 функционируют как ожидаемые даже для строки, содержащей пустое значение CTRY_CDE.Но когда я использую следующий файл:
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, так что я не уверен, что происходит из-за неопытности (может быть, есть параметр, который я не смог проверить, чтобы избежать этой проблемы), или если здесь что-то еще играет в отношении того, как файлчитать, но я не могу до конца разобраться в этом