我需要在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。