Univocity - проблема в проверке заголовка файла во время нескольких чтений - PullRequest
0 голосов
/ 03 июля 2018

Я использую итератор бина Univocity-Parser для чтения каждой строки файла и получения бина. Я наблюдал странное поведение в библиотеке, когда пытался прочитать один и тот же файл несколько раз.

Код при передаче объекта File экземпляру CsvParser: закрытая статическая пустота testBeanIterator () создает исключение {

        try {

            File sampleFile = generateFile(0);
            /*
            System.out.println("Sample file content = " + FileUtils.readFileToString(sampleFile,
                    Charset.defaultCharset()));
                    */
            for (int i = 0; i < 1000; i++) {

                BufferedReader reader =
                        new BufferedReader(new InputStreamReader(new FileInputStream(sampleFile),
                                StandardCharsets.UTF_8));

                AtomicInteger atomicInteger = new AtomicInteger();

                final BeanProcessor<CustomerSegmentMapping> rowProcessor =
                        new BeanProcessor<CustomerSegmentMapping>(CustomerSegmentMapping.class) {

                    @Override
                    public void beanProcessed(@Nonnull final CustomerSegmentMapping customerSegmentMapping,
                            @Nonnull final ParsingContext context) {

                        try {

                            System.out.println(OBJECT_MAPPER.writeValueAsString(customerSegmentMapping));
                            atomicInteger.getAndAdd(1);

                        } catch (Exception ex) {
                            throw new RuntimeException("error");
                        }
                    }
                };
                rowProcessor.setStrictHeaderValidationEnabled(true);

                final CsvParserSettings parserSettings = new CsvParserSettings();
                parserSettings.setRowProcessor(rowProcessor);
                parserSettings.setHeaderExtractionEnabled(true);

                final CsvParser parser = new CsvParser(parserSettings);
                //parser.parse(reader);
                parser.parse(sampleFile);

                System.out.println("Finished parser");

                if (atomicInteger.get() != 10) {
                    throw new Exception("mismatch");
                }

                reader.close();
            }
        } catch (Exception ex) {

            throw new RuntimeException("exception = " + ex.getMessage(), ex);
        } finally {

        }
}

При выполнении кода вывод консоли выводится следующим образом:

{"customerId":"6bc12a7a-2c28-4aea-a7be-6be45e16ffb2","segmentId":"S1"}
{"customerId":"da736310-e508-47ff-92b8-59d490e37a72","segmentId":"S1"}
{"customerId":"9a5d4454-e6d4-49a5-bb04-8354154d0493","segmentId":"S1"}
{"customerId":"ec2ed5cc-cd18-443b-bd69-e56fc09ba0f5","segmentId":"S1"}
{"customerId":"94ea24b0-0c83-4039-a391-1d2439c88be8","segmentId":"S1"}
{"customerId":"2baef5f9-d8cd-451d-b579-a626cb58b284","segmentId":"S1"}
{"customerId":"022a184b-1b06-49aa-b1c4-b94a6f343b04","segmentId":"S1"}
{"customerId":"bcb3984c-0495-4da8-b146-9af3983cc158","segmentId":"S1"}
{"customerId":"feef62de-1aaf-43d4-a83b-afe053db97cf","segmentId":"S1"}
{"customerId":"5825c924-55d5-4fd6-8468-ca36d47a7cae","segmentId":"S1"}

Finished parser

{"customerId":"6bc12a7a-2c28-4aea-a7be-6be45e16ffb2","segmentId":"S1"}
{"customerId":"da736310-e508-47ff-92b8-59d490e37a72","segmentId":"S1"}
{"customerId":"9a5d4454-e6d4-49a5-bb04-8354154d0493","segmentId":"S1"}
{"customerId":"ec2ed5cc-cd18-443b-bd69-e56fc09ba0f5","segmentId":"S1"}
{"customerId":"94ea24b0-0c83-4039-a391-1d2439c88be8","segmentId":"S1"}
{"customerId":"2baef5f9-d8cd-451d-b579-a626cb58b284","segmentId":"S1"}
{"customerId":"022a184b-1b06-49aa-b1c4-b94a6f343b04","segmentId":"S1"}
{"customerId":"bcb3984c-0495-4da8-b146-9af3983cc158","segmentId":"S1"}
{"customerId":"feef62de-1aaf-43d4-a83b-afe053db97cf","segmentId":"S1"}
{"customerId":"5825c924-55d5-4fd6-8468-ca36d47a7cae","segmentId":"S1"}

Finished parser

{"customerId":"6bc12a7a-2c28-4aea-a7be-6be45e16ffb2","segmentId":"S1"}
{"customerId":"da736310-e508-47ff-92b8-59d490e37a72","segmentId":"S1"}
{"customerId":"9a5d4454-e6d4-49a5-bb04-8354154d0493","segmentId":"S1"}
{"customerId":"ec2ed5cc-cd18-443b-bd69-e56fc09ba0f5","segmentId":"S1"}
{"customerId":"94ea24b0-0c83-4039-a391-1d2439c88be8","segmentId":"S1"}
{"customerId":"2baef5f9-d8cd-451d-b579-a626cb58b284","segmentId":"S1"}
{"customerId":"022a184b-1b06-49aa-b1c4-b94a6f343b04","segmentId":"S1"}
{"customerId":"bcb3984c-0495-4da8-b146-9af3983cc158","segmentId":"S1"}
{"customerId":"feef62de-1aaf-43d4-a83b-afe053db97cf","segmentId":"S1"}
{"customerId":"5825c924-55d5-4fd6-8468-ca36d47a7cae","segmentId":"S1"}

Finished parser

Exception in thread "main" java.lang.RuntimeException: exception = Could not find fields [CustomerId]' in input. Names found: [ustomerId, SegmentId]
Internal state when error was thrown: line=2, column=0, record=1, charIndex=60, headers=[ustomerId, SegmentId]
    at com.poppins.cube.common.UnivocityNahiHatanaHai.testBeanIterator(UnivocityNahiHatanaHai.java:95)
    at com.poppins.cube.common.UnivocityNahiHatanaHai.main(UnivocityNahiHatanaHai.java:37)
Caused by: com.univocity.parsers.common.DataProcessingException: Could not find fields [CustomerId]' in input. Names found: [ustomerId, SegmentId]
Internal state when error was thrown: line=2, column=0, record=1, charIndex=60, headers=[ustomerId, SegmentId]
    at com.univocity.parsers.common.processor.core.BeanConversionProcessor.mapFieldIndexes(BeanConversionProcessor.java:414)
    at com.univocity.parsers.common.processor.core.BeanConversionProcessor.mapValuesToFields(BeanConversionProcessor.java:340)
    at com.univocity.parsers.common.processor.core.BeanConversionProcessor.createBean(BeanConversionProcessor.java:508)
    at com.univocity.parsers.common.processor.core.AbstractBeanProcessor.rowProcessed(AbstractBeanProcessor.java:54)
    at com.univocity.parsers.common.Internal.process(Internal.java:21)
    at com.univocity.parsers.common.AbstractParser.rowProcessed(AbstractParser.java:596)
    at com.univocity.parsers.common.AbstractParser.parse(AbstractParser.java:133)
    at com.univocity.parsers.common.AbstractParser.parse(AbstractParser.java:605)
    at com.poppins.cube.common.UnivocityNahiHatanaHai.testBeanIterator(UnivocityNahiHatanaHai.java:83)
    ... 1 more

Process finished with exit code 1

Ниже приводится содержимое файла:

CustomerId,SegmentId
6bc12a7a-2c28-4aea-a7be-6be45e16ffb2,S1
da736310-e508-47ff-92b8-59d490e37a72,S1
9a5d4454-e6d4-49a5-bb04-8354154d0493,S1
ec2ed5cc-cd18-443b-bd69-e56fc09ba0f5,S1
94ea24b0-0c83-4039-a391-1d2439c88be8,S1
2baef5f9-d8cd-451d-b579-a626cb58b284,S1
022a184b-1b06-49aa-b1c4-b94a6f343b04,S1
bcb3984c-0495-4da8-b146-9af3983cc158,S1
feef62de-1aaf-43d4-a83b-afe053db97cf,S1
5825c924-55d5-4fd6-8468-ca36d47a7cae,S1

Насколько я понял, проблема возникает из-за того, что я передаю объект File в CsvParser. CsvParser внутренне создает объект InputStream, который не является закрытым. Если я передаю объект чтения с буферизацией вместо объекта File, проблема не возникает.

Я не могу понять, это известная проблема с парсерами Univocity или есть что-то, чего мне не хватает в понимании.

1 Ответ

0 голосов
/ 04 июля 2018

Автор библиотеки здесь. Я вижу, что ваше исключение показывает, что он получил заголовок ustomerId вместо CustomerId.

Это похоже на ошибку, введенную в версии 2.5.0, которая была исправлена ​​в версии 2.5.6, если я не ошибаюсь. Это мучило меня некоторое время, так как это была внутренняя проблема параллелизма, которую было трудно отследить. В основном, когда вы передаете файл без явной кодировки, он попытается найти маркер UTF BOM во входных данных (эффективно используя первый символ), чтобы автоматически определить кодировку. Это произошло только для InputStreams и Files.

В любом случае, это было исправлено, поэтому простое обновление до последней версии должно избавить вас от проблемы (пожалуйста, дайте мне знать, если вы не используете версию 2.5.something)

Если вы хотите остаться с текущей версией, которая у вас есть, ошибка исчезнет, ​​если вы позвоните

parser.parse(sampleFile, Charset.defaultCharset());

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

Надеюсь, это поможет

...