48.7. 4. FixedLengthRecord

FixedLengthRecord 주석은 모델의 루트 클래스를 식별하는 데 사용됩니다. 레코드 = 데이터 고정 길이 형식이 포함된 파일/메시지 선을 나타내며 여러 자식 모델 클래스에 연결할 수 있습니다. 이 형식은 필드를 약간 구체적으로 사용하여 오른쪽 또는 왼쪽에 맞을 수 있습니다.
데이터 크기가 필드 길이를 완전히 채우지 않으면 '추가' 문자를 추가할 수 있습니다.

주석 이름레코드 유형level

FixedLengthRecord

fixed

class

매개변수 이름type정보

crlf

string

선택 사항 - 가능한 값 = WINDOWS,UNIX,MAC 또는 custom; 기본값. WINDOWS - 사용할 캐리지 반환 문자를 정의할 수 있습니다. 앞에 나열된 세 개 이외의 값을 지정하면 입력하는 값(custom)이 CRLF 문자로 사용됩니다. 이 옵션은 마샬링 중에만 사용되는 반면, unmarshalling은 eol을 사용자 지정하지 않는 한 시스템 기본 JDK 제공 줄 구분 기호를 사용합니다.

EOL

string

선택 사항 - 비어 있는 문자열인 default=""입니다. 각 레코드 후 행 종료를 처리하는 데 사용할 문자입니다(다른 줄 구분 기호가 제공되지 않는 한 기본 JDK 제공 구분 기호를 사용하는 경우 기본 JDK에서 줄 구분 기호를 사용하는 데 도움이 되는 - default = ""). 이 옵션은 unmarshalling 중에만 사용됩니다. 여기서 마샬링은 다른 값을 제공하지 않는 한 "WINDOWS"로 시스템 기본 제공된 줄 구분 기호를 사용합니다.

paddingChar

char

mandatory - default value = ' '

길이

int

mandatory = 고정 길이 레코드의 크기

hasHeader

boolean

Camel 2.11 - 선택 사항 - 이 유형의 레코드 앞에 파일 / 스트림의 시작 부분에 단일 헤더 레코드가 있을 수 있음을 나타냅니다.

hasFooter

boolean

Camel 2.11 - 선택 사항 - 이 유형의 레코드 뒤에 파일 / 스트림 끝에 있는 단일 바닥글 레코드가 있음을 나타냅니다.

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 - 선택 사항 - 마지막 매핑된 파일 이외의 문자를 / 구문 분석하지 않을 때 무시할 수 있음을 나타냅니다. 이 주석은 모델의 루트 클래스에 연결되며 한 번만 선언해야 합니다.

hasHeader/hasFooter 매개변수는 isHeader/isFooter와 함께 함께 사용할 수 없습니다. 레코드는 헤더/footer 및 기본 고정 길이 레코드가 아닐 수 있습니다.

케이스 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

고정됨

@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' 값은 정확한 열 번호 대신 순차적 값을 사용하여 선택적으로 정의할 수 있습니다.

case 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는 모델의 일부로 구성된 고정 길이 헤더 및 바닥글 레코드를 검색합니다. - 주석 처리된 클래스가 기본 @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;
}

케이스 7: 고정 길이 레코드를 구문 분석할 때 콘텐츠를 Skipping합니다. (Camel 2.11.1)

일반적으로 고정 길이 레코드에는 대상 사용 사례에 필요한 것보다 더 많은 정보가 포함된 고정 길이 레코드를 제공하는 시스템과의 통합이 일반적입니다. 이 경우 필요하지 않은 해당 필드의 선언 및 구문 분석을 건너뛰는 것이 유용합니다. 이를 이해하기 위해 Bindy는 마지막 구문 분석 필드의 'pos' 값이 마지막 구문 분석 필드의 커서 위치를 벗어나는 경우 레코드 내의 다음 매핑된 필드로 건너뜁니다. 관심 필드(오드인 값 대신)에 절대 'pos' 위치를 사용하면 bindy가 두 필드 간에 콘텐츠를 건너뜁니다.

마찬가지로 일부 필드 이외의 콘텐츠는 관심이 없습니다. 이 경우 @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

}