Упорядочивание подробной записи без избавления от литерала

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

Х - Заголовок

Y - Трейлер

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

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

X10506505
RANDOM00 DATA1
RANDOM00 DATA2
Y0000001

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

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

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


person Purus    schedule 07.08.2017    source источник
comment
Какова вероятность того, что подробные записи будут начинаться с «X» или «Y»?   -  person nicoschl    schedule 11.09.2017
comment
У него есть 100% шанс, что записи трейлера и заголовка начнутся с X/Y..   -  person Purus    schedule 11.09.2017
comment
Я подумал, что вы могли бы использовать регулярное выражение, чтобы сказать, что все, что не начинается с идентификаторов заголовка и трейлера, является подробной записью. Извините, кроме этого, на самом деле нет способа идентифицировать подробные записи.   -  person nicoschl    schedule 12.09.2017
comment
Что, если запись подробностей начинается с Z или X? Мы должны рассматривать первую и последнюю записи как заголовки и трейлеры.   -  person Purus    schedule 12.09.2017


Ответы (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'

Спасибо также за помощь коллеге (Малкольму Маклину).

person nicoschl    schedule 12.09.2017