Весенний пакетный считыватель IncorrectTokenCountException принимает несколько столбцов в CSV-файле - PullRequest
0 голосов
/ 24 февраля 2019

Я никогда раньше не использовал Spring Batch, у меня есть файл csv, который мне нужен для чтения всех столбцов определенной модели, но у меня есть много исключений.

Файл csv имеет 8 полей.если есть все пять полей, обработка файла работает хорошо.но если по ошибке, если 8 полей не введены, как показано ниже:

c1; c2; C3; C4; C5; C6; C7; C8 // ЭТО РАБОТАЕТ c1; C3; C7 // НЕ РАБОТАЕТ:Сбой программы

Ошибка: Причина: org.springframework.batch.item.file.transform.IncorrectTokenCountException: неверное количество токенов, найденных в записи: ожидается 3 фактических 8.

Мой код:

@Bean
public Step Step2(StepBuilderFactory stepBuilders) throws IOException {
    System.out.println("cecStep2");
    return stepBuilders.get("fileReject")
            .<CSCivique, String>chunk(100)
            .reader(reader())
            .processor(processor2FileReject())
            .writer(writer2())
            .build();
}

@Bean
public FlatFileItemReader<CSCivique> reader() throws IOException{

    try {


    return new FlatFileItemReaderBuilder<CSCivique>().name("personItemReader")
                                .resource(new ClassPathResource(confFile ()))
                                .delimited()
                                .delimiter(";")
                                .names(new String[] { "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8" })
                                .targetType(CSCivique.class)
                                .strict(false)
                                .build();

    }catch(Exception e) {
        System.out.println("----------- Exception reader() --------------");
        return null ;
    }


}

Я хочу сохранить строки в файле отклонить как: c1; C3; C7: пожалуйста, проверьте количество полей

Спасибо.

1 Ответ

0 голосов
/ 25 февраля 2019

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

.names(new String[] { "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8" })

Таким образом, любая строка с другим числом токенов будет отклонена.

Что вы можете сделать, это использовать отказоустойчивый шаг и пропуститьэти строки с:

@Bean
public Step Step2(StepBuilderFactory stepBuilders) throws IOException {
    System.out.println("cecStep2");
    return stepBuilders.get("fileReject")
            .<CSCivique, String>chunk(100)
            .reader(reader())
            .processor(processor2FileReject())
            .writer(writer2())
            .faultTolerant()
            .skip(FlatFileParseException.class)
            .skipLimit(10)
            .build();
}

При такой конфигурации эти строки будут пропущены, и ваша работа не подведет.После этого вы можете получить количество пропусков с помощью StepExecution#getSkipCount.

В противном случае вы можете создать свой собственный LineTokenizer и токенизировать строку по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...