Spring-Batch多行记录Item Writer,每条记录的行数可变

Vic*_*cky 4 spring-batch

我有以下要求,但我无法决定采取的方法:

我需要将数据写入固定格式的输出文件,其中每条记录跨越多行,如下所示:

000120992599999990000000000000009291100000000000000000000000010000
000000000000000000000006050052570009700000050000990494920000111100
      ABCDE:WXYZ                                              0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
000000000000000000000006050052730005700001100000090494920000221200
      ABCDE:WXYZ                                              0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
000000000000000000000006050113110009700000000000000494920000311100
      ABCDE:WXYZ                                              0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
000012099259999999000000000000000929110000000000000000000000001000
Run Code Online (Sandbox Code Playgroud)

这是以上示例中的一条记录:

000000000000000000000006050052570009700000050000990494920000111100
      ABCDE:WXYZ                                              0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
      descriptiongoesheredescriptiongoesheredescriptiongoesher0200
Run Code Online (Sandbox Code Playgroud)

第一行和最后一行分别是页眉和页脚.每条记录的第一行包含几个细节.第二行有一些其他的空格细节.

我有一个很长的描述字段,我需要分成56个字符的部分,然后追加记录的第3行以上.

所以在一些记录中,这可能只是一行,而在某些记录中也可能是三行.

我需要有关如何在上述场景中设计我的项目编写者的指导.

Mic*_*low 7

在官方的spring-batch-samples中有一个多行记录编写器示例,搜索multiline.xmlMultiLineTradeItemWriter

它基本上是通常的委托原则,你只需要一个合适的域对象,可以使用这些1..n中间行的列表

    public class MultiLineTradeItemWriter implements ItemWriter<Trade>, ItemStream {

    private FlatFileItemWriter<String> delegate;

    public void write(List<? extends Trade> items) throws Exception {
                List<String> lines = new ArrayList<String>();
              for (Trade t : items) {
              lines.add("BEGIN");
              lines.add("INFO," + t.getIsin() + "," + t.getCustomer());
              lines.add("AMNT," + t.getQuantity() + "," + t.getPrice());
              lines.add("END");
            }
            this.delegate.write(lines);
     }
    }
Run Code Online (Sandbox Code Playgroud)