1

我需要在python中编写代码,它将打包的十进制数据转换为分区十进制或十进制数据。如果有人已经为它编写了函数,请帮助我。

提前致谢。

4

1 回答 1

1

这取决于您如何存储打包的数据,但绝对最好的方法是将 COBOL 解码器从 COMP-3 编码为数字或字母数字,它只是:

  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 在右下角指示)。

  • bline = line.encode('cp1141')如果您的数据被转换为 ASCII 或 UTF-8,您将无法将其返回到 EBCDIC,因为某些字节可能会被省略,无论如何 Python程序只会更改bline = bytes(line, 'ascii')

我让你在这个GitHub 存储库中编写 python 和 COBOL 程序。

于 2021-02-15T21:30:00.253 回答