OpenCSV CsvToBean: первый столбец не читается для UTF-8 без спецификации - PullRequest
0 голосов
/ 17 мая 2019

Использование OpenCSV для анализа документов UTF-8 без BOM приводит к тому, что первый столбец не читается.Предоставление в качестве входных данных того же содержимого документа, но закодированного в UTF-8 с спецификацией, работает правильно.

Я специально установил кодировку в UTF-8

    fileInputStream = new FileInputStream(file);
    inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
    reader = new BufferedReader(inputStreamReader);
    HeaderColumnNameMappingStrategy<Bean> ms = new HeaderColumnNameMappingStrategy<Bean>();
    ms.setType(Bean.class);
    CsvToBean<Bean> csvToBean = new CsvToBeanBuilder<Bean>(reader).withType(Bean.class).withMappingStrategy(ms)
            .withSeparator(';').build();
    csvToBean.parse();

IСоздан пример проекта, в котором проблема может быть воспроизведена: https://github.com/dajoropo/csv2beanSample

Запустив модульное тестирование, вы увидите, как файл UTF-8 без спецификации завершается сбоем и работает с спецификацией правильно.

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

[Bean [a = null , b = секунда, c = третий]]

Любая подсказка?

1 Ответ

1 голос
/ 20 мая 2019

Если я открою Bean класс в вашем проекте и поищу «B», тогда я найду одну запись.Если я ищу «А», то не могу :) Это означает, что вы копируете / вставляете А с заголовком спецификации в Bean класс.Заголовок спецификации не виден, но все еще учитывается.

Если я исправлю «А», то другой тест начнет проваливаться, но я думаю, что вы можете это исправить, используя BOMInputStream.

. Проверьте этот вопрос иответ Метка порядка следования байтов затрудняет чтение файлов в Java

Это известная проблема.Вы можете использовать Apache Commons IO BOMInputStream для ее решения.

Только что попробовал

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

и

        inputStreamReader = new InputStreamReader(new BOMInputStream(fileInputStream), StandardCharsets.UTF_8);

и исправление

@CsvBindByName(column = "A")
private String a;

для исключения префикса из «А» оба теста проходят успешно

...