48.7. 4.FixedLengthRecord
FixedLengthRecord 注解用于标识模型的根类。它代表记录 = 包含已固定长度的文件/消息的行,并可链接到多个子类。这个格式是字段中的一个特定用法数据,可以与右或左键一致。
当数据的大小不会完全填写字段的长度时,我们可以添加"padd"字符。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| FixedLengthRecord | FIXED | 类 |
| 参数名称 | type | info |
|---|---|---|
| crlf | 字符串 | 可选 - 可能的值 = WINDOWS、UNIX、MAC 或 custom; 默认值。WINDOWS - 允许定义要使用的回车字符。如果您指定之前列出的三个值以外的值,则输入(custom)的值将用作 CRLF 字符。这个选项只在 marshalling 期间使用,而 unmarshalling 使用系统默认 JDK 提供行分隔符,除非 eol 已自定义 |
| EOL | 字符串 | 可选 - default="",它是一个空字符串。字符用于在未编出时(可选 - default = "" )在每条记录后结束行结束,这将帮助 JDK 提供默认的 JDK 提供行分隔符,除非提供任何其他行分隔符)。这个选项只适用于 unmarshalling,其中 marshalling 使用系统默认的分隔符作为"WINDOWS",除非提供任何其他值 |
| paddingChar | char | mandatory - 默认值 = ' ' |
| length | int | mandatory = 固定长度记录的大小 |
| hasHeader | 布尔值 | Camel 2.11 - 可选 - 表明此类型的记录前面是文件 / 流开头的单个标头记录 |
| hasFooter | 布尔值 | Camel 2.11 - 可选 - 表明此类型的记录可能后跟文件 / stream 末尾的单个 footer 记录 |
| skipHeader | 布尔值 | Camel 2.11 - 可选 - 配置数据格式,以跳过标题记录的 marshalling / unmarshalling。在主记录(例如,而不是标题或页脚)上配置此参数。 |
| skipFooter | 布尔值 | Camel 2.11 - 可选 - 配置数据格式,以跳过页脚记录的总结/未总结,在主记录(例如,而不是标头或 footer)上配置此参数。 |
| isHeader | 布尔值 | Camel 2.11 - 可选 - 识别这个 FixedLengthRecord 作为标头记录 |
| isFooter | 布尔值 | Camel 2.11 - 可选 - 识别这个 FixedLengthRecords 作为页脚记录 |
| ignoreTrailingChars | 布尔值 | Camel 2.11.1 - 可选 - 在卸载 / 解析时,可以忽略最后一个映射文件以外的字符。 此注解与模型的 root 类关联,必须声明一个时间。 |
hasHeader/hasFooter 参数与Header/isFooter 相互排斥。记录不可是标题/页脚和主固定长度记录。
问题单 1:简单固定长度记录
这个简单示例演示了如何设计模型来解析/格式固定的信息
10A9PaulineMISINXD12345678BUYShare2500.45USD01-08-2009
fixed-simple
@FixedLengthRecord(length=54, paddingChar=' ')
public static class Order {
@DataField(pos = 1, length=2)
private int orderNr;
@DataField(pos = 3, length=2)
private String clientNr;
@DataField(pos = 5, length=7)
private String firstName;
@DataField(pos = 12, length=1, align="L")
private String lastName;
@DataField(pos = 13, length=4)
private String instrumentCode;
@DataField(pos = 17, length=10)
private String instrumentNumber;
@DataField(pos = 27, length=3)
private String orderType;
@DataField(pos = 30, length=5)
private String instrumentType;
@DataField(pos = 35, precision = 2, length=7)
private BigDecimal amount;
@DataField(pos = 42, length=3)
private String currency;
@DataField(pos = 45, length=10, pattern = "dd-MM-yyyy")
private Date orderDate;
}问题单 2:修复长度记录,并提供对齐和 padding
这更详细地阐述了如何定义字段的对齐以及如何分配 padding 字符,该字符是"这里"
10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009
fixed-padding-align
@FixedLengthRecord(length=60, paddingChar=' ')
public static class Order {
@DataField(pos = 1, length=2)
private int orderNr;
@DataField(pos = 3, length=2)
private String clientNr;
@DataField(pos = 5, length=9)
private String firstName;
@DataField(pos = 14, length=5, align="L") // align text to the LEFT zone of the block
private String lastName;
@DataField(pos = 19, length=4)
private String instrumentCode;
@DataField(pos = 23, length=10)
private String instrumentNumber;
@DataField(pos = 33, length=3)
private String orderType;
@DataField(pos = 36, length=5)
private String instrumentType;
@DataField(pos = 41, precision = 2, length=7)
private BigDecimal amount;
@DataField(pos = 48, length=3)
private String currency;
@DataField(pos = 51, length=10, pattern = "dd-MM-yyyy")
private Date orderDate;
}案例 3:字段 padding
有时,为记录定义的 default padding 不能应用于字段,因为我们想使用 '0' 而非 '' 添加内容格式。在这种情况下,您可以在模型中使用属性 paddingField 来设置这个值。
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
fixed-padding-field
@FixedLengthRecord(length = 65, paddingChar = ' ')
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
@DataField(pos = 5, length = 9)
private String firstName;
@DataField(pos = 14, length = 5, align = "L")
private String lastName;
@DataField(pos = 19, length = 4)
private String instrumentCode;
@DataField(pos = 23, length = 10)
private String instrumentNumber;
@DataField(pos = 33, length = 3)
private String orderType;
@DataField(pos = 36, length = 5)
private String instrumentType;
@DataField(pos = 41, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 53, length = 3)
private String currency;
@DataField(pos = 56, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}案例 4:使用分隔符修复长度
修复了长度记录,有时在记录中包含分隔的内容。firstName 和 lastName 字段使用以下示例中的 '^' 字符分隔:
10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009
固定分隔
@FixedLengthRecord()
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, delimiter = "^")
private String firstName;
@DataField(pos = 4, delimiter = "^")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 10)
private String instrumentNumber;
@DataField(pos = 7, length = 3)
private String orderType;
@DataField(pos = 8, length = 5)
private String instrumentType;
@DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 10, length = 3)
private String currency;
@DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}从 Camel 2.11 开始,固定长度记录中的 'pos' 值可以选择使用 或dinal 定义,顺序值而不是精确列号。
问题单 5:使用记录定义字段长度的修复长度
有时,固定长度记录可能包含用于定义相同记录中另一个字段的预期长度的字段。在以下示例中,instrumentNumber 字段值的长度由记录中的 instrumentNumberLen 字段的值定义。
10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
固定分隔
@FixedLengthRecord()
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, delimiter = "^")
private String firstName;
@DataField(pos = 4, delimiter = "^")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 2, align = "R", paddingChar = '0')
private int instrumentNumberLen;
@DataField(pos = 7, lengthPos=6)
private String instrumentNumber;
@DataField(pos = 8, length = 3)
private String orderType;
@DataField(pos = 9, length = 5)
private String instrumentType;
@DataField(pos = 10, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 11, length = 3)
private String currency;
@DataField(pos = 12, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}问题单 6:带有标题和页脚修复长度记录
Bindy 将发现配置为模型的一部分配置的固定长度标题和 footer 记录 - 提供注解类存在于与主 @FixedLengthRecord 类或其中一个配置的扫描软件包中。以下文本演示了两个固定长度记录,这些记录由标题记录和页脚记录进行编码。
101-08-2009 10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009 10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009 9000000002
fixed-header-and-footer-main-class
@FixedLengthRecord(hasHeader = true, hasFooter = true)
public class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 2, length = 2)
private String clientNr;
@DataField(pos = 3, length = 9)
private String firstName;
@DataField(pos = 4, length = 5, align = "L")
private String lastName;
@DataField(pos = 5, length = 4)
private String instrumentCode;
@DataField(pos = 6, length = 10)
private String instrumentNumber;
@DataField(pos = 7, length = 3)
private String orderType;
@DataField(pos = 8, length = 5)
private String instrumentType;
@DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
private BigDecimal amount;
@DataField(pos = 10, length = 3)
private String currency;
@DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
private Date orderDate;
}
@FixedLengthRecord(isHeader = true)
public class OrderHeader {
@DataField(pos = 1, length = 1)
private int recordType = 1;
@DataField(pos = 2, length = 10, pattern = "dd-MM-yyyy")
private Date recordDate;
}
@FixedLengthRecord(isFooter = true)
public class OrderFooter {
@DataField(pos = 1, length = 1)
private int recordType = 9;
@DataField(pos = 2, length = 9, align = "R", paddingChar = '0')
private int numberOfRecordsInTheFile;
}case 7 :解析固定长度记录时跳过内容。(Camel 2.11.1)
通常与提供固定长度记录(包含目标用例所需信息)的系统集成很常见。在这种情况下,跳过声明并解析我们不需要的这些字段。为 accomodate,如果下一个声明字段的 'pos' 值超出最后一个解析字段的光标位置,则 Bindy 将跳过至记录中的下一个映射字段。将绝对的 'pos' 位置用于感兴趣的字段(而不是 或dinal 值)会导致 Bindy 跳过两个字段之间的内容。
同样,除某些字段之外的内容都可能值得关注。在这种情况下,您可以通过在 @FixedLengthRecord 声明上设置 ignoreTrailingChars 属性来跳过除最后映射字段以外的任何内容的解析。
@FixedLengthRecord(ignoreTrailingChars = true)
public static class Order {
@DataField(pos = 1, length = 2)
private int orderNr;
@DataField(pos = 3, length = 2)
private String clientNr;
// any characters that appear beyond the last mapped field will be ignored
}