2009-04-27 13 views
5

Tôi đang tạo một gói SSIS để đọc dữ liệu chưa được giải nén từ một loạt các tệp trích từ sách. Tôi không chắc chắn về cách giải thích chính xác các định nghĩa trường sau và hy vọng ai đó sẽ biết:Giải thích các trường thập phân được đóng gói COMP-3 thành các giá trị số

FIELD-NAME-1 PIC S9 (15) V9 (3) COMP-3.
FIELD-NAME-2 PIC S9 (3) V9 (8) COMP-3.
FIELD-NAME-3 PIC S9 (3) V9 (6) COMP-3.

Dữ liệu được lưu trữ trong văn bản có chiều rộng cố định. Các dữ liệu cho các lĩnh vực trên có độ dài sau:

LĨNH VỰC-TÊN-1: 19 LĨNH VỰC-TÊN-2: 11 LĨNH VỰC-TÊN-3: 9

Tôi không chắc chắn làm thế nào để giải thích các số thập phân đặt và ký tên.

Mọi trợ giúp sẽ được đánh giá cao.

Kind Regards, Ham

Trả lời

2

Ở đây chúng ta đi:

PIC là "bức tranh"
S9 (15) có nghĩa là một lĩnh vực 15 chữ số ký: S cho dấu hiệu, 9 là số, (15) là chiều dài. V là vị trí thập phân 9 (3) là một số có ba chữ số

và COMP-3 là số thập phân được mã hóa BCD. Mỗi nybble (half-byte) của lĩnh vực này là một giá trị thập phân ở dạng nhị phân, vì vậy

0b01110110 (duh)

là "76".

18 chữ số yêu cầu 9 byte, dấu là nybble thấp của byte đặt hàng thấp.

Điều này làm tôi lo lắng, những điều này sẽ yêu cầu byte.

Đây là nice article on it.

2

Thông thường các trường COMP-3 bao gồm BCD chữ số được đóng gói thành từng byte hai, mỗi chữ số sử dụng một khối nibble (4 bit). Chữ số cuối cùng nằm trong phần trên của byte cuối cùng. Nibble thấp hơn của byte cuối cùng có 13 nếu số âm, và số khác, (thường là 12) nếu dương. Dấu thập phân được ngụ ý.

Ví dụ: -1.2 trông giống như vậy trong hex, dấu D cuối cùng là dấu âm.

01 2D 

12,345 là:

12 34 5C 
4

Dưới đây là một chút nỗ lực khác nhau tại giải đáp thắc mắc của bạn.

PIC S9 (15) V9 (3) COMP-3 trông như thế này trong file:

00 00 00 00 00 00 00 00 00 0F 

Nếu giá trị là -4.568.248.323, nó sẽ là:

00 00 00 00 04 56 82 48 32 3D 

Điều này không giúp bạn, nhưng có thể giúp đỡ người khác. Unpacked giá trị trước đó sẽ như thế nào:

F0 F0 F0 F0 F0 F0 F0 F0 F0 F4 F5 F6 F8 F2 F4 F8 F3 F2 D3 (or F3 as the last byte, therefore losing the sign) 

Trường này có 15 (trên thực tế 16) chữ số trước dấu thập phân và 3 sau đó.

Mặc dù nó chỉ yêu cầu 18 chữ số (15 + 3), nó được 19 để làm cho nó một lĩnh vực chiều dài thậm chí với dấu (một chữ số được thêm vào phía trước để làm cho nó dài 10 byte trên tệp). Thực hành tốt nhất là luôn luôn làm cho các lĩnh vực đóng gói một chiều dài lẻ để tránh nhầm lẫn này.

** Chữ cái cuối cùng biểu thị dấu, C & F là số dương, D là số âm. Đối với chương trình của bạn, hãy kiểm tra âm tính (D) và nếu không, hãy coi là dương tính.

** Chữ 'V' là dấu thập phân ngụ ý. nó không tồn tại trên tập tin, nhưng COBOL biết rằng nó ở đó để làm tròn và như vậy. Bạn cần phải lập trình tài khoản cho nó. Không có gì trong tệp để giúp bạn xác định vị trí của nó hoặc nếu nó tồn tại.

Hai trường khác đã là độ dài lẻ, vì vậy khi được đóng gói, với dấu, chúng có thể được lưu trữ trong một khoảng thời gian dài.

Bất kỳ câu hỏi nào khác, chỉnh sửa câu hỏi của bạn hoặc hỏi trong nhận xét và ai đó sẽ cố gắng trả lời chúng cho bạn.

1

dài COMP-3 lĩnh vực được tính như số chữ số mà chúng ta cần lưu trữ + 1 chia cho 2. Ví dụ để lưu trữ một trường số có giá trị 987, chúng tôi sẽ yêu cầu 3 +1 chia cho 2 = 2 Do đó trường Comp-3 có chiều dài 2 byte có thể lưu trữ giá trị +999 đến -999 là giới hạn.

15 sẽ được lưu trữ là 01 5C. Vì vậy, bốn bit cuối cùng của số được sử dụng để lưu trữ các dấu hiệu của số đó là C hoặc D để "C" đại diện cho số dương và "D" đại diện cho số âm. Và mỗi số có 4 bit để thể hiện chính chúng.

Vì vậy, một số có 7 chữ số sẽ yêu cầu kích thước 7 +1 = 8/2 = 4 byte. Vì vậy, trường comp-3 có kích thước 4 byte có thể lưu trữ một số chữ số từ +999,9999 đến -999,9999 chữ số.

Trong trường hợp câu hỏi trên để di chuyển phần thập phân của số cần xác định biến có thể chỉ lưu phần thập phân và di chuyển giá trị sang trường đó sẽ chỉ giữ phần thập phân.

như FIELD-NAME-3 PIC S9 (3) V9 (6) COMP-3.

chúng tôi cần xác định trường thập phân như DEC-PORTION V9 (6) comp-3 và sau đó di chuyển FIELD-NAME-3 sang DEC-PORTION để giữ phần thập phân của giá trị.

Bằng cách này, chúng tôi có thể có phần thập phân của số được tách riêng với số đầy đủ.