Сопоставление CSV Apache Commons не найдено

Я пытаюсь прочитать 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 Apache Commons не найдено

Спасибо!

Мне интересно, может ли это быть связано с этой проблемой: stackoverflow.com/questions/10277348/…, но если да, я не могу понять, как это обойти.

Norman Percy 06.12.2018 03:06

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

centic 08.12.2018 12:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
2
5 319
3

Ответы 3

У меня такое же странное исключение. На самом деле он сказал: «Ожидается одно из ...», а затем перечислил поля, которые, по его словам, не могут найти - как и в вашем случае.

Причина в том, что я установил неправильный формат 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

Это должно быть отмечено как принятое. Обратите внимание, что в вопросе проблема также связана с первым столбцом.

RyanQuey 10.09.2020 21:42

Я также получил то же исключение, указав другое имя заголовка в файле 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();
  }
}

Другие вопросы по теме