beanIO:用文字识别不同的记录
beanIO: identify different records with literal
情况:
我使用 beanIO 2.1.0 将 csv 文件读入不同类型的对象。
这是我的 csv 文件。动物列表(颜色、类型、腿数)。
在我的列表中还有没有类型的动物(最后一行)。
brown;cat;4
white;dog;4
brown;dog;4
black;;8
我想将 csv 文件读入不同的动物对象。
如果类型是 'cat' 它应该是一个猫对象。狗也一样。
如果类型不是猫或狗,例如空的或未知的动物类型,那么它应该是一个动物对象。
这里属于beanIO-mapping:
<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 时,或者当它是空 string/object.
时,你想要匹配一个 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 映射文件中使记录定义的名称唯一。记录名称在错误消息中用于报告问题的位置。如果所有记录的记录名称相同,您将不知道从哪里查找问题。
情况:
我使用 beanIO 2.1.0 将 csv 文件读入不同类型的对象。
这是我的 csv 文件。动物列表(颜色、类型、腿数)。 在我的列表中还有没有类型的动物(最后一行)。
brown;cat;4
white;dog;4
brown;dog;4
black;;8
我想将 csv 文件读入不同的动物对象。 如果类型是 'cat' 它应该是一个猫对象。狗也一样。 如果类型不是猫或狗,例如空的或未知的动物类型,那么它应该是一个动物对象。
这里属于beanIO-mapping:
<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 时,或者当它是空 string/object.
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 映射文件中使记录定义的名称唯一。记录名称在错误消息中用于报告问题的位置。如果所有记录的记录名称相同,您将不知道从哪里查找问题。