压缩十进制到分区十进制或十进制转换python

时间:2015-10-08 09:12:37

标签: python cobol copybook packed-decimal

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

先谢谢。

1 个答案:

答案 0 :(得分: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 值,请查看 this table 或您的模拟终端或 COBOL IDE(openCOBOL 在右下角指出)。

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

我让你在这个 GitHub repo 中同时编程 python 和 COBOL。