Я пытаюсь прочитать CSV-файл с определенными заголовками в Java-объекте, используя Apache Commons CSV. Однако когда я запускаю код, я получаю следующее исключение:
Exception in thread "main" java.lang.IllegalArgumentException: Mapping for Color not found, expected one of [Color, Name, Price, House Cost, Rent, 1 House, 2 Houses, 3 Houses, 4 Houses, Hotel, Mortgage]
at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:102)
at GameBoard.<init>(GameBoard.java:25)
at Game.main(Game.java:3)
Может кто-нибудь объяснить, откуда исходит исключение? Мне кажется, что Apache Commons каким-то образом не сопоставляет мой ввод с столбцом. Что-то не так с моей стороны или что-то еще не работает? Вот мой фрагмент кода:
Reader in;
Iterable<CSVRecord> records = null;
try {
in = new FileReader(new File(Objects.requireNonNull(getClass().getClassLoader().getResource("Properties.csv")).getFile()));
records = CSVFormat.EXCEL.withFirstRecordAsHeader().parse(in);
} catch (IOException | NullPointerException e) {
e.printStackTrace();
System.exit(1);
}
for (CSVRecord record :
records) {
spaces.add(new Property(
record.get("Color"),
record.get("Name"),
Integer.parseInt(record.get("Price")),
И вот мои заголовки csv (извините, один был отрезан, но дело не в этом):

Спасибо!
Похоже на странное несоответствие, он не соответствует заголовку, пока этот заголовок находится в списке. Возможно, некоторые специальные символы или конечные пробелы в CSV-файле, вы можете показать, как файл CSV выглядит как текст, то есть содержимое файла CSV.




У меня такое же странное исключение. На самом деле он сказал: «Ожидается одно из ...», а затем перечислил поля, которые, по его словам, не могут найти - как и в вашем случае.
Причина в том, что я установил неправильный формат CSVFormat:
CSVFormat csvFormat = CSVFormat.newFormat(';');
Это означало, что мой код пытался разделить поля на полуколоны в файле, который на самом деле имел разделители запятая.
Как только я использовал формат DEFAULT CSVFormat, все начало работать.
CSVFormat csvFormat = CSVFormat.DEFAULT;
Итак, ответ заключается в том, что, вероятно, вы должны правильно установить CSVFormat для своего файла.
У меня была такая же проблема, которая возникает только в том случае, если вы ссылаетесь на первый столбец, все остальные имена столбцов работают. Проблема в том, что представление UTF-8 добавляет следующие символы «0xEF, 0xBB, 0xBF» (см. Страница Википедии). Кажется, это известная проблема для commons-csv, но поскольку это зависит от приложения, она не будет исправлена (CSVFormat.EXCEL.parse должен обрабатывать метки порядка байтов).
Однако для этого есть документированный обходной путь:
http://commons.apache.org/proper/commons-csv/user-guide.html#Handling_Byte_Order_Marks
Это должно быть отмечено как принятое. Обратите внимание, что в вопросе проблема также связана с первым столбцом.

Я также получил то же исключение, указав другое имя заголовка в файле CSV, например xyz, или попытался получить значение, вызвав csvRecord.get("x_z")
Я решил свою проблему, изменив имя заголовка xyz.
try {
fileReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
csvParser = new CSVParser(fileReader,
CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());
Iterable<CSVRecord> csvRecords = csvParser.getRecords();
CSVFormat csvFormat = CSVFormat.DEFAULT;
for (CSVRecord csvRecord : csvRecords) {
} catch (Exception e) {
System.out.println("Reading CSV Error!");
e.printStackTrace();
} finally {
try {
fileReader.close();
csvParser.close();
} catch (IOException e) {
System.out.println("Closing fileReader/csvParser Error!");
e.printStackTrace();
}
}
Мне интересно, может ли это быть связано с этой проблемой: stackoverflow.com/questions/10277348/…, но если да, я не могу понять, как это обойти.