beanIO:使用文字标识不同的记录

时间:2018-12-16 12:03:40

标签: java csv bean-io

情况

我使用beanIO 2.1.0将csv文件读取到不同类型的对象中。

这是我的csv文件。动物列表(颜色,类型,腿数)。 在我的列表中,还有没有类型的动物(最后一行)。

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

我想将csv文件读入不同的动物对象。 如果类型为“猫”,则应为猫对象。狗也一样。 如果类型不是猫或狗,例如空的或未知的动物类型,那么它应该是动物对象。

这是所属的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 :(得分:0)

编辑:在OP发表评论后更新了答案。

这不是BeanIO中的错误。您可以使用两个选项来标识记录。首先,您拥有到目前为止所使用的literal属性。其次,您还可以使用正则表达式(regex)来标识记录。

Animal字段不是cat或dog时,或者如您所说的是空字符串/对象时,您要匹配type对象。

您的type字段定义可以是Animal记录的两个字段之一。

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

这里,只要类型字段包含Java正则表达式定义的空格,它就会匹配。

OR

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

这将匹配type字段中不包含单词catdog的任何记录。

尝试使用此动物记录:

<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映射文件中使记录定义的名称唯一。记录名称用于错误消息中,用于报告问题的位置。如果所有记录的记录名称都相同,那么您将不知道在哪里查找问题。