问题描述
如何检测定长文件中相同的记录类型? BeanIO 只检测到第一个记录头,没有其他两个文件。 我想要的是获取带有三个文档及其项目代码的包装类。
PHP.ini
我想检测标题 (RH) 和详细信息 (RD) 记录。
顶级班级:
UnkNown record
UnkNown record
RH20210607A
RDitem1
RDitem2
UnkNown record
RH20210607B
RDitem2
RDitem3
UnkNown record
UnkNown record
UnkNown record
RH20210607C
RDitem1
RDitem4
RDitem5
子组类:
@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,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,length=8,format = "yyyyMMdd")
private LocalDate documentDate;
@Field(ordinal = 2,length = 1,padding = ' ',align = Align.LEFT)
private String documentCode;
}
BeanReader 的初始化:
@Data
@Record
public class RD{
@Field(ordinal = 0,literal = "RD")
private String recordtype;
@Field(ordinal = 1,length = 5,align = Align.LEFT)
private String itemCode;
}
感谢帮助
解决方法
我没有找到正确的解决方案,但我找到了解决方法。
想要进行一次阅读并获得文档列表
这是解决方法。
首先我不明白 beanReader.read() 提取流的第一个元素。所以没有必要创建ListDocumentWrapper,而是用一个简单的while循环读取所有文档。
这是代码的摘录:
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++;
}