Упакованный десятичный в зональный десятичный или десятичный питон преобразования
Мне нужно написать код на Python, который будет преобразовывать упакованные десятичные данные в зонные десятичные или десятичные данные. Если у кого-то уже есть функция для этого, пожалуйста, помогите мне с этим.
Заранее спасибо.
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, посмотрите в этой таблице, в терминале эмуляции или в COBOL IDE (openCOBOL указывает его в правом нижнем углу).
- Если ваши данные были переведены в ASCII или UTF-8, у вас возникнут проблемы с возвратом их в EBCDIC, потому что некоторые байты могут быть опущены, в любом случае программа Python просто изменится
bline = line.encode('cp1141')
заbline = bytes(line, 'ascii')
Я разрешил вам использовать обе программы на Python и COBOL в этом репозитории GitHub.