1

パック 10 進数データをゾーン 10 進数または 10 進数データに変換するコードをPythonで記述する必要があります。

前もって感謝します。

4

1 に答える 1

1

パッケージ化されたデータをどのように保存するかによって異なりますが、COMP-3 から数値または英数字に COBOL デコーダーをコーディングするのが間違いなく最善の方法です。単純に次のようになります。

  01 WS-YOUR-COMP-DATA PIC 9(xx) COMP-3.
  01 WS-NUMERIC-VAR        9(xx).
...
  PROCEDURE DIVISION.
*  ---> here you read your data
*  ---> then convert it:
       MOVE WS-YOUR-COMP-DATA TO WS-NUMERIC-VAR.
*  ---> and finally, you send it or write it into your dataset/queue/DB.

ただし、それができない、またはしたくない場合は、データの保存方法によって決定されるいくつかのオプションを次に示します。

  • データが元のエンコーディング (IBM EBCDIC) を保持している場合、次のようになります。
import ebcdic

file = open("your-file.txt",'r')

for line in file:
    #Usually the cp1141 is for Austria, Germany, Switzerland characters.
    bline = line.encode('cp1141')
    print(bline.hex())
file.close()

入力:

       FD FILEO
           RECORDING MODE IS F.
       01 FILEO-REC        PIC S9(10) COMP-3.
       01 FILEO-REC1       PIC S9(09) COMP-3.
       01 FILEO-REC2       PIC  9(09) COMP-3.
       01 FILEO-REC3       PIC  9(10) COMP-3.
       WORKING-STORAGE SECTION.
       01 FS-FILEO         PIC 9(02).
           88 FS-FILEO-OK              VALUE 00.
       01  WS-COUNT        PIC 9(02).
       01  WS-I            PIC 9(02).
       01 WS-MY-VAR OCCURS 0 TO 10 TIMES DEPENDING ON WS-COUNT
                           PIC S9(10) COMP-3.
       
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           MOVE 4          TO WS-COUNT
           MOVE 0123456789 TO WS-MY-VAR(1)
           MOVE 123456789  TO WS-MY-VAR(2)
           MOVE ZEROES     TO WS-MY-VAR(3)
           MOVE -123456789 TO WS-MY-VAR(4)

      *Now we test with each of the four option in every record structure.

S9(10) を使用した出力:

00123456789c
00123456789c
00000000000c
00123456789d

S9(09) での出力:

123456789c
123456789c
000000000c
123456789d

9(09) を使用した出力:

123456789f
123456789f
000000000f
123456789f

9(10) の出力:

00123456789f
00123456789f
00000000000f
00123456789f

ご覧のとおり、印刷された文字はまったく同じですが、最後に文字が追加されています。この文字は、数値が負符号の場合は「d」、正符号の場合は「c」、数値が符号なしの場合は「f」になります。これらの最後の文字は、長さが奇数の場合にのみフィラーとして表示されます。元。9(07) は奇数です。7 を 2 で割ると 3.5 になり、4 に丸められ、0.5 のスペースに文字が入ります。とにかく、私のテストでは、OpenCOBOL がこの規則に従わず、いっぱいになることがわかりました。

エンコーディング cpxxxx 値を見つけるには、この表、またはエミュレート端末または COBOL IDE (openCOBOL が右下隅に示しています) を参照してください。

  • データが ASCII または UTF-8 に変換された場合、一部のバイトが省略される可能性があるため、データを EBCDIC に戻すのに問題が発生しますbline = line.encode('cp1141')bline = bytes(line, 'ascii')

このGitHub リポジトリで python と COBOL の両方のプログラムを作成できます。

于 2021-02-15T21:30:00.253 に答える