情况:
我使用beanIO2.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映射中配置它?
编辑:OP评论后的更新答案。
这不是BeanIO中的错误。您有两个选项来标识记录。首先,您拥有迄今为止使用的literal
属性。其次,您还可以使用正则表达式(regex
(来标识具有的记录。
当type
字段不是cat或dog时,或者当它是空字符串/对象时,您希望匹配Animal
对象。
您的type
字段定义可以是Animal
记录的两个字段之一。
<field name="type" rid="true" regex="s*" />
在这里,只要类型字段包含java正则表达式定义的空格,它就会匹配。
或
<field name="type" rid="true" regex=""^(?:(?!b(cat|dog)b).)*$" />
这将匹配type
字段不包含单词cat
或dog
的任何记录。
试试这个动物记录:
<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映射文件中使记录定义的名称唯一。记录名称用于错误消息中,用于报告问题的位置。如果所有记录都有相同的记录名称,您将不知道在哪里查找问题。