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
}