Обрабатывать файл плоской подачи кобола (с другим форматом) с помощью пружинной партии - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь использовать Spring Batch для использования данных, сгенерированных программой cobol. Предположим, что ниже приведены данные.

CBMWM3    COU**********EA40176
CBMWM5    CON**********G114738
SMERGLS4507BLU**********F231353
TFORF150  5*******G539501

В файле есть три различных формата, основанных на первом символе.

C - MAKE, MODEL, CLASSIFICATION, VIN
S - MAKE, MODEL, PASS CAPACITY, COLOR, VIN
T - MAKE, MODEL, PASS CAPACITY, VIN

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

Редактировать 1:

@Bean
    public FlatFileItemReader<CarDetails> reader() {
        return new FlatFileItemReaderBuilder<CarDetails>()
                .name("carDetailsReader")
                .resource(new FileSystemResource("/path/to/inputFile"))
                .fixedLength()
                    .addColumns(new Range(1))

                    /* Format for lines starting with C
                    .addColumns(new Range(2,4))
                    .addColumns(new Range(5,9))
                    .addColumns(new Range(10,12))
                    .addColumns(new Range(13,29)) */

                    /* Format for lines starting with S
                    .addColumns(new Range(2,4))
                    .addColumns(new Range(5,9))
                    .addColumns(new Range(9,10))
                    .addColumns(new Range(11,13))
                    .addColumns(new Range(14,30)) */

                    /* Format for lines starting with T
                    .addColumns(new Range(2,4))
                    .addColumns(new Range(5,9))
                    .addColumns(new Range(9,10))
                    .addColumns(new Range(11,26)) * /

                 // Looks like I cant have all three formats here. 

                .names(new String[]{"Char", "make", "model", "Clasification", "VIN"})
                // Need some facility to accept multiple formats in names too. 

                .fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
                    setTargetType(CarDetails.class);
                }})
                .build();
    }

1 Ответ

1 голос
/ 19 февраля 2020

PatternMatchingCompositeLineMapper - это то, что вы ищете. Он позволяет сопоставлять строки на основе шаблона и маркировать / сопоставлять каждый тип линии с соответствующим типом домена.

Пример использования можно найти здесь .

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