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