我需要在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.
虽然,如果您不能也不想这样做,这里有一些选项取决于您如何保存数据:
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 程序。