0

我是使用 BeanIO 2.1 的新手,我又遇到了一个问题。

我正在尝试解码一个固定长度的文件,该文件的一些记录分布在几行上,其中“rid”仅标记在这些行的第一行

例子:

:10:BLABLABLABLA
:11:/TRTP/SEPA OVERBOEKING/IBAN
HR W HERMAN
503270327C30,49NTRFSCT20111212
:12:BLABLABLABLA

如您所见,记录 ':11:' 分布在 3 行中。我想将这些行作为字符串列表获取,其中的 rid ':11:' 将被忽略。

这是 mapping.xml 文件:

<record name="ownerInformation" order="2" class="com.batch.records.OwnerInformation" minOccurs="1" maxOccurs="6" collection="list">
    <field name="tag" type="string" length="4" rid="true" literal=":11:" ignore="true" />
    <field name="description" type="string" length="unbounded" maxLength="65" />
</record>

结果,异常UnexpectedRecordException:

org.beanio.UnexpectedRecordException:到达流结束,预期记录'ownerInformation'

再次感谢你帮助我

4

2 回答 2

1

可以映射跨越多条记录的 Bean 对象

您必须为每一行创建记录 ID,例如: 我正在使用命令来分隔字段。

11,/TRTP/SEPA OVERBOEKING/IBAN
12,HR W HERMAN
13,503270327C30
13,49NTRFSCT20111212

像这样的东西:

<group name=ownerInfo class="com.batch.records.OwnerInformation" minOccurs="1" maxOccurs="6">
  <record name="typeInfo" class="com.batch.records.Type" order="1" minOccurs="1" maxOccurs="1" >
    <field name="recordType" rid="true" literal="11" ignore="true" />
    <field name="iban" />
  </record>
  <record name="customer" class="com.batch.records.Customer" order="2" minOccurs="1" maxOccurs="1" >
    <field name="recordType" rid="true" literal="12" ignore="true" />
    <field name="name" />
  </record>
  <record name="items" class="com.batch.records.Item" collection="list" order="3" minOccurs="1" maxOccurs="unbounded" >
    <field name="recordType" rid="true" literal="13" ignore="true" />
    <field name="id" />
  </record>
</group>

这将映射到OwnerInformation这样的:

package com.batch.records;

/* Getters and Setter are omitted for brevity */

public class OwnerInformation {
  Type type;
  Customer customer;
  List<Item> items;
}

public class Type {
  String iban;
}

public class Customer {
  String name;
}

public class Item {
  String id;
}
于 2015-07-14T13:44:20.157 回答
0

一种方法是绘制出您不需要的行,因此它包括您想要从数据中派生的内容。下面是一个可以按原样处理不同记录类型的映射。这会为您提供您正在寻找的正确订单项。

请注意,每行都有一个“消除”,对于数据行,您基本上使用正则表达式来表示“任何不以冒号开头的内容”。在您的“while read()”代码中,您可以使用以下方法触发您的逻辑:

if (reader.getRecordName().equals("record11"))

或进一步使用映射并添加组。

这是 mapping.xml 以根据需要区分您的行:

<beanio xmlns="http://www.beanio.org/2012/03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.beanio.org/2012/03 http://www.beanio.org/2012/03/mapping.xsd">

<stream name="fabizFile" format="fixedlength">
    <record name="record10">
        <field name="recordType" rid="true" literal=":10:" />
        <field name="sometext" length="12" />
    </record>
    <record name="record11">
        <field name="recordType" rid="true" literal=":11:" />
        <field name="sometext" length="unbounded" maxLength="40" />
    </record>
    <record name="record12">
        <field name="recordType" rid="true" literal=":12:" />
        <field name="sometext" length="unbounded" maxLength="40" />
    </record>
    <record name="goodstuff" class="FabizModel">
        <field name="recordText" rid="true" regex="^(?!:).+" length="unbounded" maxLength="50" />
    </record>
</stream>
</beanio>
于 2016-10-17T20:51:45.837 回答