検索

46.6. 4.FixedLengthRecord

download PDF

FixedLengthRecord アノテーションは、モデルのルートクラスを特定するために使用されます。これは、フォーマットされたデータが含まれるファイル/メッセージの記録 = 行を表し、複数の子モデルクラスにリンクできます。この形式は、フィールドのビット固有データで、右側または左側に合わせることができます。
データのサイズがフィールドの長さが完全に一杯でない場合は、「padd」文字を追加することができます。

アノテーション名レコードタイプレベル

FixedLengthRecord

固定:

クラス

パラメーター名typeInfo

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

}
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.