segment - beanio 是否可以根据另一个字段中的条件值支持动态分段?
问题描述
我正在尝试映射固定长度的消息,这些消息可能具有不同的段,具体取决于另一个字段中的值?
例如:
<stream name="employeeFile" format="csv">
<record name="employee" class="example.Employee">
<field name="firstName" length="10" />
<field name="lastName" length="10" />
<field name="title" length="10" />
<field name="salary" length="6" padding="0" justify="right" />
<field name="hireDate" length="8" format="MMddyyyy" />
<field name="segmentEnum" length="10" />
<segment name="mailingAddressSimple" class="example.Address">
<field name="street" length="50" />
<field name="city" length="20" />
<field name="state" length="2" />
<field name="zip" length="5" />
</segment>
<segment name="mailingAddressFull" class="example.FullAddress">
<field name="street" length="30" />
<field name="state" length="2" />
<field name="city" length="20" />
<field name="zip" length="5" />
<field name="country" length="10" />
<field name="phone" length="10" />
</segment>
</record>
</stream>
</beanio>
在此示例中,我将需要根据 segmentEnum 值映射具有动态段的固定长度消息。当segmentEnum 值为“Simple”时,使用段“mailingAddressSimple”映射字符串,但当值为“Full”时,使用“mailingAddressFull”段映射消息。它是简单的或完整的。
解决方案
根据我对用户手册的了解和理解,您所问的内容是不可能的。
我看到简单映射和完整映射之间的区别只是完整映射的最后两个字段。我的建议是仅在mapping.xml
文件中包含完整映射的详细信息,并使最后 2 个字段 (country
和phone
) 可选。这仍然允许您完全读取平面文件并填充您的对象。然后,我会在读取文件后遍历对象图,然后根据枚举的值将FullAddress
对象拆分为Address
和对象。FullAddress
这完全取决于您的用例以及您对使用它的代码和流程的控制。如果您可以详细说明所涉及的其他因素,我们也许可以找到另一个解决方案。
编辑:
您可以考虑的唯一选择是map
为您的细分使用内联。但是它仍然需要一些后期处理来确定它是一个地址Simple
还是Full
地址。请参阅重复段文档,尤其是Sec 4.5.2.1 Inline Maps
推荐阅读
- mongodb - 将新密钥添加到 Mongodb 上的集合中(有序)
- objective-c - NSPropertyListSerialization dataWithPropertyList 返回错误 3851
- python - 为什么 df_sub 不将日期识别为索引的一部分?
- node.js - 在开发期间和 docker build for production 期间使用 eslint 缓存是否安全?
- react-native-sqlite-storage - 如何在 react-native-sqlite-storage 查询中使用 LIKE
- bash - 是否可以在 psql 中结合使用 `-c` 和 `-v`?
- python - 使用日期时间从字符串中提取预期日期
- cron - 每年 2 天运行 cronjob
- ios - 使用表格数据进行 CoreML 设备上模型训练
- python - 有没有办法改变 Plotly Sankey 图中的文本对齐方式?