beanIO: идентифицировать разные записи с помощью литерала

СИТУАЦИЯ:

Я использую 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-mapping?

1 ответ

Решение

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

Это не ошибка в 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. Имя записи используется в сообщениях об ошибках для сообщения о местонахождении проблемы. Если у вас одинаковое имя для всех записей, вы не будете знать, где искать проблему.

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