Как написать файл mapping.xml, когда мы пытаемся прочитать форматы множественного ввода, используя BeanIO - PullRequest
0 голосов
/ 09 ноября 2018

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

Как написать свой картографический XML-файл и прочитать его из Java?

Я пытался написать несколько потоков, но это не сработало.

Мой 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="ebcdicFile" format="delimited">
        <parser>
            <property name="delimiter" value="|" />
        </parser>
        <record name="header"
            class="sft_action_cms_apt_394.sft_action_cms_apt_394.FileSegment">
            <field name="fileName" />
            <field name="batchCount" />
            <field name="totalRecords" />
            <field name="maxBatchSize" />
            <field name="pickUpTime" />
            <field name="errorFlag" />
        </record>
    </stream>
    <stream name="file" format="fixedlength">
        <record name="dec"
            class="sft_action_cms_apt_394.sft_action_cms_apt_394.pojo">
            <field name="tag" length="4" />
            <field name="description" length="unbounded" />
        </record>
    </stream>
</beanio>

1 Ответ

0 голосов
/ 12 ноября 2018

Я не думаю, что ваш вариант использования покрыт BeanIO. Я бы попробовал сделать что-то вроде этого:

  • Убедитесь, что вы используете реализацию Reader, которая поддерживает маркировку и сброс. Примером является стандарт java.io.BufferedReader
  • Сначала mark() ваша текущая позиция на входе BufferedReader.
  • Считайте столько данных, сколько вам нужно, чтобы вручную определить, какой из ваших 2 потоков BeanIO использовать для чтения данных и преобразования их для вас в ваши объекты.
  • Теперь reset() BufferedReader, это заставит его «вернуться» в ту же точку, где вы назвали mark().
  • Теперь используйте BeanIO для чтения ваших данных.

Возможно, вам придется повторить описанный выше процесс или настроить его в зависимости от структуры ваших данных. Вы не показываете, является ли ваш «заголовок» отдельной записью или это может происходить несколько раз между записями «dec»

Если у вас есть только одна запись «header» и несколько записей «dec», вы можете упростить описанный выше процесс с помощью чего-то вроде:

  • Считайте первую строку ваших данных напрямую с помощью метода BufferedReader.readLine() в String. Передайте эту строку читателю BeanIO, чтобы проанализировать ее и вернуть объект «заголовок».

    String firstLine = bufferedReader.readLine (); BeanReader beanReader = null; FileSegment fileSegment = null; try (Reader in = new BufferedReader (new StringReader (firstLine)))) { beanReader = factory.createReader ("ebcdicFile", в); fileSegment = (FileSegment) beanReader.read (); }

  • Теперь вы можете создать еще один BeanReader для чтения оставшихся входных данных, используя поток "file".

...