beanIO: идентифицировать разные записи с помощью литерала - PullRequest
0 голосов
/ 16 декабря 2018

СИТУАЦИЯ :

Я использую beanIO 2.1.0 для чтения csv-файла в объекты различного типа.

Это мой csv-файл.Список животных (окрас, тип, количество ног).В моем списке также есть животные без типа (последняя строка).

brown;cat;4
white;dog;4
brown;dog;4
black;;8

Я хочу прочитать csv-файл в разные животные-объекты.Если тип 'cat', это должен быть объект cat.То же самое с собакой.Если тип не кошка или собака, например, пустой или неизвестный тип животного, то это должен быть объект-животное.

Здесь принадлежащее beanIO-отображение:

<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="animalFile" format="csv" >
    <parser>
      <property name="delimiter" value=";"/>
    </parser>
    <record name="animal" class="zoo.Cat">
      <field name="color" />
      <field name="type" rid="true" literal="cat"/>
      <field name="legs"/>
    </record>
    <record name="animal" class="zoo.Dog">
      <field name="color" />
      <field name="type"  rid="true" literal="dog"/>
      <field name="legs"/>
    </record>
    <record name="animal" class="zoo.Animal" >
      <field name="color" />
      <field name="type"/>
      <field name="legs"/>
    </record>
  </stream>
  </beanio>

Моя программа читает csv-файл, анализирует его с помощью beanIO и вызывает toString-метод проанализированных объектов.

Это вывод.Выглядит нормально:

CAT: brown;cat;4
DOG: white;dog;4
DOG: brown;dog;4
ANIMAL: black;;8

ПРОБЛЕМА:

Теперь я просто изменяю порядок животных в csv-файле.Во втором ряду неизвестный тип животного:

brown;cat;4
black;;8
white;dog;4
brown;dog;4

Это новый вывод!Когда первое неизвестное животное найдено, все следующие строки также являются неизвестными животными.

CAT: brown;cat;4
ANIMAL: black;;8
ANIMAL: white;dog;4
ANIMAL: brown;dog;4

ВОПРОС:

Это ошибка в beanIO или я могунастроить его в beanIO-отображении?

1 Ответ

0 голосов
/ 17 декабря 2018

РЕДАКТИРОВАТЬ: Обновленный ответ после комментариев от OP.

Это не ошибка в BeanIO.У вас есть два варианта идентификации записи.Во-первых, у вас есть атрибут literal, который вы использовали до сих пор.Во-вторых, вы также можете использовать регулярное выражение (regex) для идентификации записей с.

Вы хотите сопоставить объект Animal, когда поле type не кошка или собака, или как вы указали, когдаэто пустая строка / объект.

Ваше определение поля type может быть одним из двух для записи Animal.

<field name="type" rid="true" regex="\s*" />

Здесь оно будет соответствовать всякий раз, когда поле типа содержитпробелы, определенные в регулярных выражениях Java.

ИЛИ

<field name="type" rid="true" regex=""^(?:(?!\b(cat|dog)\b).)*$" />

Это будет соответствовать любой записи, где поле type не содержит слов cat или dog.

Попробуйте это с этой записью Animal:

<record name="animal" class="zoo.Animal" >
  <field name="color" />
  <field name="type" rid="true" regex=""^(?:(?!\b(cat|dog)\b).)*$" />
  <field name="legs"/>
</record>

Не по теме .Технически вы не читаете файл CSV, потому что тогда ваш разделитель должен быть запятой.Вместо этого у вас есть формат с разделителями, в котором в качестве разделителя используется точка с запятой (;).

Я бы также предложил сделать имена определений ваших записей уникальными в файле сопоставления xml.Имя записи используется в сообщениях об ошибках для сообщения о местонахождении проблемы.Если у вас одинаковое имя для всех записей, вы не будете знать, где искать проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...