【发布时间】: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