Marshaling Detail Record, не избавившись от буквального

У меня есть файл фиксированной длины в следующем формате.

X - Заголовок

Y - Трейлер

Записи данных не имеют никакого литерала-идентификатора в качестве первого символа.

Пример данных:

X10506505
RANDOM00 DATA1
RANDOM00 DATA2
Y0000001

Запись заголовка разбирается нормально.

Проблема: запись трейлера отображается в запись подробностей, так как запись подробностей не имеет уникального идентификатора.

Как я могу отличить запись трейлера от подробной записи?

1 ответ

Следующие mapping.xml файл работает для меня. Вы увидите, что я использую rid на более чем одном поле. Это заставляет BeanIO использовать больше данных в режиме онлайн для определения правильной записи.

<stream name="dummy" format="fixedlength" minOccurs="1" maxOccurs="1" >
  <group name="myFile" class="com.company.project.File" >
    <record name="header" class="com.company.project.Header" minOccurs="1" maxOccurs="1">
      <field name="id" rid="true" length="1" required="true" literal="X" />
      <field name="h1" rid="true" length="8" required="true" regex=".{8}" />
      <field name="h2" length="4" required="false" minOccurs="0"/>
    </record>
    <record name="detailRecords" class="com.company.project.Detail" minOccurs="1" maxOccurs="unbounded" collection="collection">
      <field name="d1" rid="true" length="9" required="true" regex=".{8,9}" />
      <field name="d2" rid="true" length="5" required="true" regex=".{5}" /> 
      <field name="d3" length="5" required="false" minOccurs="0"/> 
    </record>  
    <record name="trailer" class="com.company.project.Trailer" minOccurs="1" maxOccurs="1">
      <field name="id" rid="true" length="1" required="true" literal="Y" />
      <field name="tValue" rid="true" length="7" required="true" regex=".{7}" />
    </record>
  </group>
</stream>

Если это не сработает для вас, мне потребуются более конкретные данные и, если возможно, фактические данные.

Тест 1:

X10506505
RANDOM00 DATA1
RANDOM00 DATA2
Y0000001

Выход:

Header: id='X', h1='10506505'
Detail: d1='RANDOM00', d2='DATA1'
Detail: d1='RANDOM00', d2='DATA2'
Trailer: id='Y', tValue='0000001'

Тест 2:

X10506505
RANDOM00 DATA1
RANDOM00 DATA2
XANDOM00 DATA3
YANDOM00 DATA4
Y0000001

Выход:

Header: id='X', h1='10506505'
Detail: d1='RANDOM00', d2='DATA1'
Detail: d1='RANDOM00', d2='DATA2'
Detail: d1='XANDOM00', d2='DATA3'
Detail: d1='YANDOM00', d2='DATA4'
Trailer: id='Y', tValue='0000001'

Также необходимо поблагодарить коллегу (Малкольма Маклина) за помощь.

Другие вопросы по тегам