使用 spring 批处理 cobol 平面提要文件(不同格式)
Process cobol flat feed file (with different format) using spring batch
我正在尝试使用 spring 批处理来使用 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 引导。
编辑 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();
}
PatternMatchingCompositeLineMapper 就是您要找的。它允许您根据模式和 tokenize/map 将每种线型与相应的域类型相匹配。
您可以找到如何使用它的示例 here。
我正在尝试使用 spring 批处理来使用 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 引导。
编辑 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();
}
PatternMatchingCompositeLineMapper 就是您要找的。它允许您根据模式和 tokenize/map 将每种线型与相应的域类型相匹配。
您可以找到如何使用它的示例 here。