【问题标题】:BeanIO how to skip/filter @Group in fixedLengthBeanIO如何在fixedLength中跳过/过滤@Group
【发布时间】:2021-09-29 14:37:45
【问题描述】:

我正在尝试读取一个固定长度的文件。 我想提取文档列表,但 过滤 仅使用具有字段值“BB”的 RecordHeader (RH)。 所以跳过带有recordHeader等于的文档:

RH20210607AA   

这是我的类文档的一个例子

@Group
public class Document{

    @Record(order = 1, minOccurs=1, maxOccurs=1)
    private RH recordHeader;
    @Record(order = 2, minOccurs=1, maxOccurs = -1, type=RD.class, collection = List.class)
    private List<RD> recordDetails;
}

这是我的类 RH 的一个例子

@Record
public class RH{

    @Field(ordinal = 0, required = true, length = 2, align = Align.LEFT, rid = true, literal = "RH")
    private String recordType;

    @Field(ordinal = 1, required = true, length=8, format = "yyyyMMdd")
    private LocalDate documentDate;

    @Field(ordinal = 2, required = true, length = 2, padding = ' ', align = Align.LEFT)
    private String documentCode;
}

这是一个固定长度文件的例子:

fake
Unknown record
Unknown record
RH20210607AA    
RDitem1
RDitem2
Unknown record
RH20210607BB    
RDitem2
RDitem3
Unknown record
Unknown record
Unknown record
RH20210607BB    
RDitem1
RDitem4
RDitem5

感谢您的帮助

【问题讨论】:

    标签: bean-io fixed-length-file


    【解决方案1】:

    您可以在RH 类中使用多个字段来标识您想要的记录。你可以这样做:

    @Record
    public class RH {
    
      @Field(ordinal = 0, required = true, length = 2, align = Align.LEFT, rid = true, literal = "RH")
      private String recordType;
    
      @Field(ordinal = 1, required = true, length = 8, format = "yyyyMMdd")
      private Date documentDate;
    
      @Field(ordinal = 2, required = true, length = 2, padding = ' ', align = Align.LEFT, rid = true, literal = "BB")
      private String documentCode;
    
    }
    

    注意@Field 注释中documentCode 字段的额外属性 --> rid = true, literal = "BB"

    如果您需要包含更多 RH 记录或将其用作排除过滤器,则可以使用正则表达式代替 literal = "BB"

    您可能已经这样做了,您还需要配置StreamFactory 以忽略无法识别的记录:

    final StreamBuilder builder = new StreamBuilder("streamName")
        .readOnly()
        .format("fixedlength")
        .parser(new FixedLengthParserBuilder())
        .ignoreUnidentifiedRecords()             // <-- important
        .addGroup(...)
        .addRecord(RD.class));
    factory.define(builder);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 2011-04-13
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      相关资源
      最近更新 更多