Одна запись на несколько строк, только сначала с RID

Я новичок в использовании BeanIO 2.1 и снова столкнулся с проблемой.

Я пытаюсь декодировать файл фиксированной длины, в котором некоторые записи распределены по нескольким строкам, где «рид» отмечен только в первой из этих строк.

Пример:

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

Как видите, запись ':11:' занимает 3 строки. Я хотел бы получить эти строки как список строк, где ':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»

Еще раз спасибо за помощь


person Fabiz    schedule 07.04.2015    source источник


Ответы (2)


Можно сопоставлять объекты компонентов, которые охватывают несколько записей.

Вам нужно будет создать идентификатор записи для каждой из строк, например: Я использую команды для разделения полей.

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;
}
person Niel de Wet    schedule 14.07.2015

Один из методов заключается в том, чтобы отобразить строки, которые вам не нужны, и, таким образом, включить то, что вы хотите получить из данных. Ниже приведено сопоставление, которое может обрабатывать ваши различные типы записей как есть. Это даст вам правильные позиции, которые вы ищете.

Обратите внимание, что у вас есть «рид» для каждой строки, а для ваших строк данных вы в основном используете регулярное выражение, чтобы сказать «все, что не начинается с двоеточия». В коде 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>
person J8lug    schedule 17.10.2016
comment
Привет и спасибо за ваш ответ. В конце концов я решил создать группу, в которой первая запись действительно содержит литерал :11:, а записи следующих строк не ограничены каким-либо префиксом. Таким образом, я мог получить один объект со всей информацией в одном месте. - person Fabiz; 21.10.2016