46.6. 4.FixedLengthRecord
FixedLengthRecord アノテーションは、モデルのルートクラスを特定するために使用されます。これは、フォーマットされたデータが含まれるファイル/メッセージの記録 = 行を表し、複数の子モデルクラスにリンクできます。この形式は、フィールドのビット固有データで、右側または左側に合わせることができます。
データのサイズがフィールドの長さが完全に一杯でない場合は、「padd」文字を追加することができます。
アノテーション名 | レコードタイプ | レベル |
---|---|---|
FixedLengthRecord | 固定: | クラス |
パラメーター名 | type | Info |
---|---|---|
crlf | string | オプション - 使用できる値 = WINDOWS、UNIX、MAC、または custom(デフォルト値)WINDOWS - 使用するキャリッジリターン文字を定義できます。前述した 3 つの値以外の値を指定すると、入力する値が CRLF 文字として使用されます。このオプションはマーシャリング時にのみ使用されますが、eol がカスタマイズされない限り、アンマーシャリングはシステムのデフォルト JDK が提供する行区切り文字を使用します。 |
EOL | string | オプション: default=""(空の文字列)アンマーシャリング中に各レコードの後に行末を処理するのに使用する文字(任意: default = "")。これは、他の行区切り文字を指定しない限り、デフォルトの JDK が提供する行区切り文字の使用に役立ちます。このオプションは、アンマーシャリング時にのみ使用されます。マーシャリングは、その他の値を提供しない限り、システムのデフォルトの区切り文字を「WINDOWS」として使用します。 |
paddingChar | char | mandatory - デフォルト値 = ' ' |
長さ | int | 必須 = 固定長レコードのサイズ |
hasHeader | boolean | Camel 2.11: オプション: このタイプのレコードの前に、ファイル/ストリームの先頭にある単一のヘッダーレコードが追加されることを示唆します。 |
hasFooter | boolean | Camel 2.11: 任意: このタイプのレコードの後に、ファイル/ストリームの最後に 1 つのフッターレコードがあることを示します。 |
skipHeader | boolean | Camel 2.11 - オプション: ヘッダーレコードのマーシャリング/アンマーシャリングを省略するようにデータフォーマットを設定します。プライマリーレコード(ヘッダーやフッターなど)にこのパラメーターを設定します。 |
skipFooter | boolean | Camel 2.11 - オプション: フッターレコードのマーシャリング/アンマーシャリングをスキップするようにデータフォーマットを設定します(ヘッダーやフッターではなく)。 |
isHeader | boolean | Camel 2.11 - オプション: この FixedLengthRecord をヘッダーレコードとして特定 |
isFooter | boolean | Camel 2.11 - オプション: この FixedLengthRecords をフッターレコードとして特定 |
ignoreTrailingChars | boolean | Camel 2.11.1 - オプション: アンマーシャリング/解析時に、最後にマップされた filed 以外の文字を無視できることを示します。 このアノテーションはモデルの root クラスに関連付けられ、一度宣言する必要があります。 |
hasHeader/hasFooter パラメーターは isHeader/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 - 調整とパディングを使用した長さレコードの修正
この例は、フィールドの調整を定義する方法と、パディング文字(「ここ」)を定義する方法を示しています。
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: フィールドパディング
レコードに定義されたデフォルトのパディングはフィールドに適用することができない場合があります。' の代わりに '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
fixed-delimited
@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」値は、正確な列番号ではなく、ordinal の連続値を使用して定義することができます。
ケース5: レコード定義フィールド長のレコードレコードの修正
固定長レコードには、同じレコード内の別のフィールドの想定される長さを定義するフィールドが含まれる場合があります。以下の例では、instrumentNumber フィールド値の長さはレコードの instrumentNumberLen フィールドの値によって定義されます。
10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
fixed-delimited
@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 は、モデルの一部として設定された固定長ヘッダーとフッターレコードを検出します。アノテーションされたクラスがプライマリー @FixedLengthRecord クラスと同じパッケージ内または設定されたスキャンパッケージのいずれかに存在する場合です。以下のテキストは、ヘッダーレコードとフッターレコードで 2 つの固定長のレコードを示しています。
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)
ターゲットのユースケースに必要な以上の情報が含まれる固定長レコードを提供するシステムを統合することが一般的です。この状況は、必要のないこれらのフィールドの宣言をスキップして解析する場合に役立ちます。これを許容するために、次の宣言されたフィールドの「pos」値が最後に解析されたフィールドのカーソル位置を超えても、Bindy はレコード内の次のマップされたフィールドへ進むようスキップします。(ordinal 値の代わりに)対象のフィールドに「pos」ロケーションを使用すると、Bindy は 2 つのフィールド間でコンテンツをスキップします。
同様に、フィールド以外のコンテンツは重要ではありません。この場合、@FixedLengthRecord 宣言に ignoreTrailingChars プロパティーを設定することで、Bindy に最後にマップされたフィールド以外のすべての解析をスキップするように指示できます。
@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 }