Я пытаюсь использовать синтаксический анализатор csv univocity для анализа файла csv с более чем 3 миллионами строк в список java beans. Я настроил его, как в моем примере, но когда я разбираю csv, каждый Java-компонент имеет нулевые значения атрибутов. Я поигрался с настройками, но не смог понять, в чем моя ошибка. Вот зависимости от maven, которые я использую:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>
<dependency>
    <groupId>com.univocity</groupId>
    <artifactId>univocity-parsers</artifactId>
    <version>2.7.6</version>
</dependency>

Это мой тестовый класс:

public class ParserTest {
    public List<OdsTx> start(File file) {
        BeanListProcessor<OdsTx> rowProcessor = new BeanListProcessor<OdsTx>(OdsTx.class);
        CsvParserSettings settings = new CsvParserSettings();
        settings.setDelimiterDetectionEnabled(true, ';');
        settings.setProcessor(rowProcessor);
        CsvParser parser = new CsvParser(settings);
        parser.parse(file);
        return rowProcessor.getBeans();
    }
    public static void main(String[] args) {
        String filename = "input/ods_TX.csv";
        File file = new File(filename);
        int testrow = 3;
        ParserTest test = new ParserTest();
        List<OdsTx> result = test.start(file);
        System.out.println("result size: " + result.size());
        System.out.println(result.get(testrow).toString());
    }

}

А это мой боб:

public class OdsTx {
    @Parsed(index = 0)
    private String CARDID;
    @Parsed(index = 1)
    private String ACCEPTANCEDATE;
    @Parsed(index = 2)
    private String AMOUNT;
    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    }
    public String getCARDID() {
        return CARDID;
    }
    public void setCARDID(String cARDNO) {
        CARDID = cARDNO;
    }
    public String getACCEPTANCEDATE() {
        return ACCEPTANCEDATE;
    }
    public void setACCEPTANCEDATE(String aCCEPTANCEDATE) {
        ACCEPTANCEDATE = aCCEPTANCEDATE;
    }
    public String getAMOUNT() {
        return AMOUNT;
    }
    public void setAMOUNT(String aMOUNT) {
        AMOUNT = aMOUNT;
    }
}

Это мой CSV-файл:

CARDID;ACCEPTANCEDATE;AMOUNT
12345168852;2018-01-01-07.56.29.000000;900
1234100080716;2018-01-01-09.19.26.000000;1000
1234100087256;2018-01-01-09.32.53.000000;1000
1234100087256;2018-01-01-09.33.03.000000;1000
12345199915;2018-01-01-09.41.44.000000;200
12345199915;2018-01-01-09.41.46.000000;200

Мой результат с использованием моего метода toString() всегда выглядит следующим образом:

result size: 6
de.westlotto.connect.mehrfach.model.csv.OdsTx@4b9af9a9[
  CARDNO=<null>
  ACCEPTANCE_DATE=<null>
  AMOUNT=<null>
]

РЕДАКТИРОВАТЬ:

У меня была ошибка в пути к файлу. Теперь я получаю следующую ошибку:

Exception in thread "main" com.univocity.parsers.common.TextParsingException: java.lang.ArrayIndexOutOfBoundsException - 512
Hint: Number of columns processed may have exceeded limit of 512 columns. Use settings.setMaxColumns(int) to define the maximum number of columns your input can have
Ensure your configuration is correct, with delimiters, quotes and escape sequences that match the input format you are trying to parse
Parser Configuration: CsvParserSettings:
    Auto configuration enabled=true
    Autodetect column delimiter=false
    Autodetect quotes=false
    Column reordering enabled=true
    Delimiters for detection=null
    Empty value=null
    Escape unquoted values=false
    Header extraction enabled=false
    Headers=null
    Ignore leading whitespaces=true
    Ignore leading whitespaces in quotes=false
    Ignore trailing whitespaces=true
    Ignore trailing whitespaces in quotes=false
    Input buffer size=1048576
    Input reading on separate thread=true
    Keep escape sequences=false
    Keep quotes=false
    Length of content displayed on error=-1
    Line separator detection enabled=false
    Maximum number of characters per column=4096
    Maximum number of columns=512
    Normalize escaped line separators=true
    Null value=null
    Number of records to read=all
    Processor=com.univocity.parsers.common.processor.BeanListProcessor
    Restricting data in exceptions=false
    RowProcessor error handler=null
    Selected fields=field selection: [0, 1, 2]
    Skip bits as whitespace=true
    Skip empty lines=true
    Unescaped quote handling=nullFormat configuration:
        CsvFormat:
            Comment character=#
            Field delimiter=;
            Line separator (normalized)=\n
            Line separator sequence=\n
            Quote character="
            Quote escape character="
            Quote escape escape character=null
0
htz 7 Дек 2018 в 12:35

1 ответ

Лучший ответ

Автор библиотеки здесь. Вы не опубликовали информацию, с которой работаете, но я предполагаю, что ваши проблемы могут исходить от settings.detectFormatAutomatically(';');.

Проверьте, какой формат был обнаружен с помощью parser.getDetectedFormat(). Возможно, он обнаружил неправильный разделитель.

В несвязанном примечании, поскольку вы сопоставляете свои атрибуты с фиксированными позициями, а не с именами заголовков, вам не нужна эта аннотация @Headers. Вам также не нужны аннотации @Trim в каждом атрибуте, поскольку синтаксический анализатор по умолчанию обрезает все значения за вас.

1
Jeronimo Backes 10 Дек 2018 в 05:15