BeanIO定长记录中的键值映射

时间:2017-06-13 11:16:28

标签: java bean-io

对于固定长度的数据文件,我有以下specification(请参阅记录-C类型的规范,第4页)

  

第二部分,长度为1,800个字符,由一个包含75个元素的表组成,用于显示通信中存在的唯一数据;这些元素中的每一个都由字段代码构成   8个字符和16个字符的字段值

这意味着前89个字符(在上面的摘要中省略)是普通的固定长度,然后,对于剩下的1800个,我必须将它们分成键值对的组,每个键组最多24个字符。修剪空格并在此过程中不考虑空对。

理想情况下,我的bean可以构造成

public class RecordC{

    private List<Pair<String, String>> table = new ArrayList<>(MAX_TABLE_SIZE); //I don't want to use Map **yet**

}

有些东西可以是Apache Common的Pair<String,String>或任何适合KVP映射的东西。

据我所知,我可以创建一个完整的1800字节的TypeHandler,但我想利用BeanIO的强大功能。

这是我到目前为止所做的事情

    <record name="RECORD_C" class="it.csttech.ftt.data.beans.ftt2017.RecordC" order="3" minOccurs="1" maxOccurs="1" maxLength="2000">
        <field name="tipoRecord" rid="true" at="0" ignore="true" required="true" length="1" lazy="true" literal="C" />

        <field name="cfContribuente" at="1" length="16" align="left" trim="true" lazy="true" />
        <field name="progressivoModulo" at="17" length="8" padding="0" align="right" trim="true" lazy="true" />
        <field name="spazioDisposizioneUtente" at="25" length="3" align="left" trim="true" lazy="true" />
        <field name="spazioUtente" at="53" length="20" align="left" trim="true" lazy="true" />

        <field name="cfProduttoreSoftware" at="73" length="16" align="left" trim="true" lazy="true" />

        <segment name="table" collection="list" lazy="true" class="org.apache.commons.lang3.tuple.ImmutablePair">
            <field name="key" type="java.lang.String" at="0" length="8" trim="true" lazy="true" setter="#1" />
            <field name="value" type="java.lang.String" at="8" length="16" trim="true" lazy="true" setter="#2" />
        </segment>

        <field name="terminatorA" at="1897" length="1" rid="true" literal="A" ignore="true" />
    </record>

不幸的是,这在测试中无效。我在列表中只得到一条记录,在[0-7]和[8-23]位置解码而不是预期[89-113] [114 - ???] [....] [.... ]

问题是:我如何在BeanIO中声明重复固定长度的字段?

1 个答案:

答案 0 :(得分:0)

我目前通过删除RecordC规范中的所有at属性来解决我的解组问题。正如我发现的那样,&#34; at&#34;属性对于记录是绝对的,而不是相对于重复段。然而,这迫使我在解组时添加一些被忽略的字段,仅需几个ignore s。

一旦有数据,我将测试对官方控制器的编组