【问题标题】:BeanIO - How to detect multiple record with same typeBeanIO - 如何检测具有相同类型的多个记录
【发布时间】:2021-08-24 09:49:27
【问题描述】:

如何在固定长度的文件中检测相同的记录类型? BeanIO 只检测到第一个记录标题,而没有其他两个文档。 我想要的是获得包含三个文档及其项目代码的包装类。

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

Unknown record
Unknown record
RH20210607A
RDitem1
RDitem2
Unknown record
RH20210607B
RDitem2
RDitem3
Unknown record
Unknown record
Unknown record
RH20210607C
RDitem1
RDitem4
RDitem5

我想检测表头 (RH) 和详细 (RD) 记录。

我为每个子组设计了一个组列表,其中包含另一个组。

顶级组类:

@Group(name = "fixedFile")
public class ListDocumentWrapper {

    @Group(minOccurs=1, type=Document.class, collection = List.class)
    List<Document> documentList;
}

子组类:

@Data
public class Document{

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

单记录类:

@Data
@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 = 1, padding = ' ', align = Align.LEFT)
    private String documentCode;
}
@Data
@Record
public class RD{

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

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

BeanReader 的初始化:

// create a StreamFactory
StreamFactory factory = StreamFactory.newInstance();
// load the mapping file
String streamBuilderName = "fixedFile";
        factory.define(
                new StreamBuilder(streamBuilderName)
                        .format("fixedlength")
                        .parser(new FixedLengthParserBuilder())
                        .ignoreUnidentifiedRecords()
                        .addGroup(ListDocumentWrapper.class)
        );

BeanReader beanReader = factory.createReader(streamBuilderName, aFileReader, Locale.ITALIAN);

感谢您的帮助

【问题讨论】:

  • 请说明您是如何构造和初始化BeanReader 实例的
  • 我更新了初始化部分。谢谢

标签: java annotations reader bean-io


【解决方案1】:

我没有找到正确的解决方案,但我找到了解决方法。

希望单次阅读并获得文档列表

这是解决方法。

首先我不明白 beanReader.read() 提取流的第一个元素。所以没有必要创建 ListDocumentWrapper,而是通过一个简单的 while 循环读取所有 Document

这是代码的摘录:

List<Document> documentList = new ArrayList<>();
Document documentMessage = null;
int documentIndex = 0;
        while ((documentMessage = (Document) beanReader.read()) != null) {
            // process the documentMessage...
            log.debug("Reading documentMessage ["+documentIndex+"]... => " + documentMessage);

            documentList.add(documentMessage);
            documentIndex++;
        }

【讨论】:

  • 很高兴您找到了解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2012-09-13
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多