Apache CSVParser не работает

1

Рассмотрим следующий пример кода:

    private static CSVFormat CSV_FORMAT = CSVFormat.TDF;
    logger.debug("Processing record: {}", line);
    try {
        CSVParser parser = CSVParser.parse(line,CSV_FORMAT);
        if(parser.getRecords().isEmpty()) continue;
        csvRecord = parser.getRecords().get(0);
    } catch (IOException e) {
        logger.warn("Skipping line: " + line,e);
        continue;
    }

По какой-то причине это не синтаксический анализ. Я получаю следующий вывод:

DEBUG:
(OrderParser#parseData:121) - Processing record:
136147091   340834429   4/5/2015 4:35:00
PM  262105109   UFH6285 6   0   0   HWF62 Holmes Humidifier Replacement
Filter  8.99    53.94   0   39.91   0   8.09    0   5.94    5.12        7035997658  Marty   Joe [email protected] Jess
Dude        555 Main st     Anywhere    CA  900000  1

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

и хотя вы, вероятно, не видите этого через StackOverflow, я гарантирую, что там есть вкладки. Однако исключение index out of bounds происходит в parser.getRecords().get(0)

Если я звоню в parser.getRecordNumber() он сообщает 1. Я не знаю, связано ли это с ошибкой кодирования символов или чем-то.

В соответствии с запросом здесь вводится образец образца, зажатый внутри предварительного тега. Там две строки, но я просто отправляю второй в:

SNumber RecD    Receip_ID   ListingID   Date_Entered    234 ReferenceId QT  QT2 QT3 Title   P456    Product_Rev Sh2687t Product Shipping    Comm    ShipFee PerItemFee  Tax_Cost    Company HoneCode    Bill455 Bill788 Email   Ship468644  Ship6489    Ship654132158   Ship98198   Ship_To_City    Ship_To_State   Ship_To_Zip ShippingMethodId
2644    7775    11457   26894   4/9/2015 9:47:00 AM 247520128   700364  1   0   0   Shark Navigator 14.99   14.99   0   11.75   0   2.25    0   0.99    0       84698   Shawn   Vanloan [email protected]  S Vanloo        166 E Main Rd       Anywhere    NY  12000   1

  • 1
    Что ж, в выводе, который у вас есть, явно есть пробелы вместо символов табуляции.
  • 0
    Да, как я уже сказал: я не думаю, что ТАК давайте люди копируют n символов табуляции
Показать ещё 3 комментария
Теги:
csv
apache-commons

2 ответа

0
Лучший ответ

Ответ Петра Чжэн заставил меня начать в правильном направлении. Для меня решение появилось в коде после вызова CSVParser.parse. Это фактически возвращает итерабельность, поэтому я продолжил следующее:

CSVParser parser = ... //Any method for obtaining a parser
for(CSVRecord record : parser) {

    //Code for operating on the record here
}
2

Согласно apidocs, parser.getRecords() анализирует файл в соответствии с заданным форматом и возвращает содержимое в виде списка. Позиция синтаксического анализа будет находиться в конце ввода. Таким образом, другой вызов parser.getRecords() вернет пустой список.

Рассмотрим синтаксический анализ входной записи.

apidocs

  • 0
    Ах да, вы нажали на это. Я не осознавал, что CSVParser на самом деле итеративный, и это меня смутило. Я считаю, что слово «Iterator» должно быть в названии класса, но, возможно, это просто повод для того, чтобы я не проверил API более тщательно!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню