2017-06-13 165 views
0

我有以下specification对于一个固定长度的数据文件(说明书的参考来记录-C型,第4页)键值映射

的第二部分,具有一长度为1800个字符,由75个元素组成,用于显示通信中唯一的数据;这些元件的每通过场码的8个字符 和由16个字符

一个域值构成

这意味着第一89个字符(在上面的概述中省略)是普通老式固定长度然后,在剩下的1800年中,我必须将它们分成多组键值对,每个键值最多可以包含24个字符。空白空间被修剪,并且在该过程中不考虑空对。

理想的是,我的豆可以被构造像

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映射的东西。

我明白我可以创建一个完整的TypeHandler,它需要1800个字节,但我想利用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中声明重复的固定长度字段?

回答

0

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

一旦我有数据,我会测试对官方控制器的调车