0

我有一个将用户信息映射到对象映射(映射或列表)的场景。

我说用户信息如下 CommonHeader(CX) 块,后跟 0 个或多个 ID 块,后跟 0 个或多个地址块

以下是用户记录的有效格式

CX|19981222|19981222|ID|DriversLicence|111111111|ID|Passport|ABC12345|AD|123 Main Street|Atlanta|GA|30316|AD|100 PeachTree RD|Atlanta|Ga|3007|
CX|19981222|19981222|ID|DriversLicence|111111111|ID|Passport|ABC12345|
CX|19981222|19981222|AD|123 Main Street|Atlanta|GA|30316|AD|100 PeachTree RD|Atlanta|Ga|3007|

是否可以使用 beanio 映射此类场景?

处理这些情况的最佳解决方案是什么?

我正在使用 Beanio-2.1

我的beanio映射文件如下

<stream name="userrRecord" format="delimited">
        <parser>
            <property name="delimiter" value="|"/>
        </parser>
        <record name="urecord" class="map" minOccurs="0" maxOccurs="unbounded" >
            <segment name="CX" class="map">
                <field name="CX"/>
                <field name="DateFirstReported" type="date" format="yyyyMMdd"/>
                <field name="DateLastReported" type="date" format="yyyyMMdd"/>
           </segment>     
            <segment name="ID" class="map"  minOccurs="0" maxOccurs="unbounded" collection="list">
                <field name="ID"/>
                <field name="IDType"/>
                <field name="DocumentID"/>
            </segment>
            < segment name="AD" class="map" minOccurs="0" maxOccurs="unbounded" collection="list">
                <field name="AD"/>
                <field name="Street"/>
                <field name="City"/>
                <field name="State"/>
                <field name="Zipcode"/>                
            </segment>
        </record>
    </stream>

当我尝试解组具有 2 个 ID 段和 0 个 AD 段的记录时,会遇到 InvalidRecord 异常。

非常感谢任何帮助。

4

2 回答 2

0

我认为这是不可能的,如 BeanIO 参考指南中所述:

Flat file formats (CSV, delimited and fixed length) may only contain one
field or segment of indeterminate length (i.e. where maxOccurs is greater
than minOccurs). The position of components that follow are assumed to be
relative to the end of the record.
于 2015-02-19T22:30:03.703 回答
0

您应该将每个段更改为单独的记录,并将其包装在一个组中。然后您的示例输入将如下所示:

CX|19981222|19981222|
ID|DriversLicence|111111111|
ID|Passport|ABC12345|
AD|123 Main Street|Atlanta|GA|30316|
AD|100 PeachTree RD|Atlanta|Ga|3007|
CX|19981222|19981222|
ID|DriversLicence|111111111|
ID|Passport|ABC12345|
CX|19981222|19981222|
AD|123 Main Street|Atlanta|GA|30316|
AD|100 PeachTree RD|Atlanta|Ga|3007|

你的映射是这样的:

<stream name="userrRecord" format="delimited">
    <parser>
        <property name="delimiter" value="|"/>
    </parser>
    <group name="urecord" class="map" minOccurs="0" maxOccurs="unbounded">
        <record name="CX" class="map">
            <field name="CX"/>
            <field name="DateFirstReported" type="date" format="yyyyMMdd"/>
            <field name="DateLastReported" type="date" format="yyyyMMdd"/>
        </record>
        <record name="ID" class="map" minOccurs="0" maxOccurs="unbounded" collection="list">
            <field name="ID"/>
            <field name="IDType"/>
            <field name="DocumentID"/>
        </record>
        <record name="AD" class="map" minOccurs="0" maxOccurs="unbounded" collection="list">
            <field name="AD"/>
            <field name="Street"/>
            <field name="City"/>
            <field name="State"/>
            <field name="Zipcode"/>
        </record>
    </group>
</stream>
于 2015-07-14T14:46:25.820 回答