我需要在 python 中编写代码,它将将压缩十进制数据转换为分区十进制或十进制数据。如果有人已经为它编写了函数,请帮助我
先谢谢。
答案 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.
不过,如果您不能也不想这样做,这里有一些选项取决于您如何保存数据:
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 在右下角指出)。
bline = line.encode('cp1141')
更改为 bline = bytes(line, 'ascii')
立>
我让你在这个 GitHub repo 中同时编程 python 和 COBOL。