打包十进制到分区十进制或十进制转换python



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

这取决于您如何存储打包的数据,但最好的方法是将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.

OUTPUT with S9(10):

00123456789c
00123456789c
00000000000c
00123456789d

OUTPUT with S9(09):

123456789c
123456789c
000000000c
123456789d

OUTPUT with 9(09):

123456789f
123456789f
000000000f
123456789f

OUTPUT with 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,因为一些字节可以省略,无论如何,Python程序只是将bline = line.encode('cp1141')更改为bline = bytes(line, 'ascii')

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

相关内容

  • 没有找到相关文章

最新更新