如何在春季批处理中分别读取平面文件标头和车身



我正在使用Spring Batch和Spring Boot进行简单的批处理作业。

我需要阅读一个平面文件,将标题数据(第一行(与个人业务逻辑处理的身体数据(线的其余部分(分开,然后将所有内容写入单个文件中。

您可以看到,标头具有5个必须映射到一个类的参数,并且身体有12个必须映射到另一个类别。

我首先想到使用FlatFileTemReader并跳过标头。然后使用SkipedlinesCallback来处理该行,但我不知道该怎么做。

我是Spring Batch和Java配置的新手。如果有人可以帮助我为我的问题写解决方案,我会确实将其付诸实践!

我在这里留下输入文件:

01.01.2017|SUBDCOBR|12:21:23|01/12/2016|31/12/2016
01.01.2017|12345678231234|0002342434|BORGIA RUBEN|27-32548987-9|FA|A|2062-
00010443/444/445|142,12|30/08/2017|142,01
01.01.2017|12345673201234|2342434|ALVAREZ ESTHER|27-32533987-9|FA|A|2062-
00010443/444/445|142,12|30/08/2017|142,02
01.01.2017|12345673201234|0002342434|LOPEZ LUCRECIA|27-32553387-9|FA|A|2062-
00010443/444/445|142,12|30/08/2017|142,12
01.01.2017|12345672301234|0002342434|SILVA JESUS|27-32558657-9|NC|A|2062-
00010443|142,12|30/08/2017|142,12

欢呼!

编辑1:这将是我的第一个attepmt。我的"身体" Pojo被称为Detallefacturacion,而我的"标头" Pojo是Cabecerafacturacion。我想使用DetalleFacturacion pojo做的读者,所以我可以跳过标头并稍后进行治疗...但是我不确定如何将标头的数据分配到cabecerafacturacion中。

public FlatFileItemReader<DetalleFacturacion> readerDetalleFacturacion(){
    FlatFileItemReader<DetalleFacturacion> reader = new FlatFileItemReader<>();
    reader.setLinesToSkip(1);
    reader.setResource(new ClassPathResource("/inputFiles/GLEO-MN170100-PROCESO01-SUBDFACT-000001.txt"));
    DefaultLineMapper<DetalleFacturacion> detalleLineMapper = new DefaultLineMapper<>();
    DelimitedLineTokenizer tokenizerDet = new DelimitedLineTokenizer("|");
    tokenizerDet.setNames(new String[] {"fechaEmision", "tipoDocumento", "letra", "nroComprobante",  
                                "nroCliente", "razonSocial", "cuit", "montoNetoGP", "montoNetoG3",
                                "montoExento", "impuestos", "montoTotal"});
    LineCallbackHandler skippedLineCallback = new LineCallbackHandler() {
        @Override
        public void handleLine(String line) {
            String[] headerSeparado = line.split("|");
            String printDate = headerSeparado[0];
            String reportIdentifier = headerSeparado[1];
            String tituloReporte = headerSeparado[2];
            String fechaDesde = headerSeparado[3];
            String fechaHasta = headerSeparado[4];
            CabeceraFacturacion cabeceraFacturacion = new CabeceraFacturacion();
            cabeceraFacturacion.setPrintDate(printDate);
            cabeceraFacturacion.setReportIdentifier(reportIdentifier);
            cabeceraFacturacion.setTituloReporte(tituloReporte);
            cabeceraFacturacion.setFechaDesde(fechaDesde);
            cabeceraFacturacion.setFechaHasta(fechaHasta);
        }
    };
    reader.setSkippedLinesCallback(skippedLineCallback);
    detalleLineMapper.setLineTokenizer(tokenizerDet);
    detalleLineMapper.setFieldSetMapper(new DetalleFieldSetMapper());
    detalleLineMapper.afterPropertiesSet();
    reader.setLineMapper(detalleLineMapper);
    // Test to check if it is saving correctly data in CabeceraFacturacion
    CabeceraFacturacion cabeceraFacturacion = new CabeceraFacturacion();
    System.out.println("Print Date:"+cabeceraFacturacion.getPrintDate());
    System.out.println("Report Identif: 
    "+cabeceraFacturacion.getReportIdentifier());
    return reader;

}

您是正确的。您需要使用skippedLinesCallback来处理跳过线。

您需要实现LineCallbackHandler接口,并在处理方法方法中添加处理。

linecallbackhandler接口传递要跳过的文件中的线路内容。如果将Linestoskip设置为2,则该接口称为两次。

这就是您可以定义读取器的方法。

Java配置 - 春季批次4

@Bean
    public FlatFileItemReader<POJO> myReader() {
        return FlatFileItemReader<pojo>().
                .setResource(new FileSystemResource("resources/players.csv"));
                .name("myReader")
                .delimited()
                .delimiter(",")
                .names("pro1,pro2,pro3")
                .targetType(POJO.class)
                .skippedLinesCallback(skippedLinesCallback)             
                .build();
    }

相关内容

  • 没有找到相关文章

最新更新