#mainframe
#мэйнфрейм
Вопрос:
Мне нужно преобразовать числа, хранящиеся в виде текстовых данных (выровненных по левому краю) в диапазоне от 2 до 4 цифр, в числовой формат (выровненный по правому краю) в мэйнфреймах.
For eg,
Field1(Text left aligned) Field2(Numeric Right aligned)
---------------------------------------------------------------
1000 1000
11 11
200 200
Можно использовать SORT EZTRIEVE COBOL.
Ответ №1:
Для решения на COBOL попробуйте использовать UNSTRING
и JUSTIFIED RIGHT
принимающее поле. Вот пример программы (IBM Enterprise COBOL) для иллюстрации.
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE1.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SOURCE-DATA PIC X(4).
01 DEST-DATA PIC X(4) JUSTIFIED RIGHT.
PROCEDURE DIVISION.
MOVE '123' TO SOURCE-DATA
UNSTRING SOURCE-DATA DELIMITED BY SPACE
INTO DEST-DATA
DISPLAY 'SOURCE >' SOURCE-DATA '<'
DISPLAY 'DEST >' DEST-DATA '<'
MOVE '1' TO SOURCE-DATA
UNSTRING SOURCE-DATA DELIMITED BY SPACE
INTO DEST-DATA
DISPLAY 'SOURCE >' SOURCE-DATA '<'
DISPLAY 'DEST >' DEST-DATA '<'
GOBACK
.
Вывод этой программы:
SOURCE >123 <
DEST > 123<
SOURCE >1 <
DEST > 1<
Ответ №2:
Это также работает…
IDENTIFICATION DIVISION.
PROGRAM-ID. STR2NUM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SOURCE-DATA PIC X(4).
01 DEST-DATA PIC BBB9.
PROCEDURE DIVISION.
MOVE '123' TO SOURCE-DATA
UNSTRING SOURCE-DATA DELIMITED BY SPACE
INTO DEST-DATA
DISPLAY 'SOURCE >' SOURCE-DATA '<'
DISPLAY 'DEST >' DEST-DATA '<'
MOVE '1' TO SOURCE-DATA
UNSTRING SOURCE-DATA DELIMITED BY SPACE
INTO DEST-DATA
DISPLAY 'SOURCE >' SOURCE-DATA '<'
DISPLAY 'DEST >' DEST-DATA '<'
GOBACK
.
Комментарии:
1. Это не работает. Во-первых, с Enterprise Cobol целью UNSTRING не может быть отредактированное поле, поэтому вы получаете серьезную ошибку компиляции «IGYPA3107-S «UNSTRING В «идентификатор» «DEST-DATA (NUMERIC-EDITED)» был недопустимым, поскольку это один из следующих: отредактированный элемент , внешний элемент с плавающей запятой, алфавитный элемент с «B» в его «КАРТИНКЕ» или числовой элемент с «P» в его «КАРТИНКЕ». Инструкция была отброшена.». Во-вторых, если бы это сработало, BBB на картинке были для трех фактических пробелов, поэтому данные были бы усечены до одной цифры / символа.
Ответ №3:
Я позволю себе не согласиться с двумя другими ответами, поскольку они, IMO, просто повторно представляют исходный текст в виде отредактированного буквенно-цифрового вывода. Вот мой пример:
IDENTIFICATION DIVISION.
PROGRAM-ID. STR2NUM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VARIABLES.
05 SRCE-DATA PIC X(4).
05 SRCE-DATA-R PIC X(4) JUST RIGHT.
05 DEST-DATA-N PIC 9(4).
05 DEST-DATA PIC ZZZ9.
PROCEDURE DIVISION.
INITIALIZE WS-VARIABLES
MOVE '11' TO SRCE-DATA
UNSTRING SRCE-DATA DELIMITED BY SPACE
INTO SRCE-DATA-R
INSPECT SRCE-DATA-R
REPLACING ALL SPACES BY ZEROES
MOVE SRCE-DATA-R TO DEST-DATA-N, DEST-DATA
DISPLAY 'SOURCE >' SRCE-DATA '<'
DISPLAY 'DEST >' DEST-DATA '<'
GOBACK
.
Поле DEST-DATA-N содержит истинную числовую версию исходных данных.
Комментарии:
1. Поскольку вы не беспокоитесь о том, что ваше «истинное число» является числовым, вы можете разархивировать в DEST-DATA-N, который выравнивается по правому краю и заполняется начальным нулем. Сохраняет ПРОВЕРКУ и ПЕРЕМЕЩЕНИЕ, и вам не нужно будет ПЕРЕМЕЩАТЬ буквенно-цифровой формат в числовой.
Ответ №4:
Более «подробный» ответ, чем у Нилба, меньшая нагрузка на процессор.
IDENTIFICATION DIVISION.
PROGRAM-ID. STR2NUM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SOURCE-DATA PIC X(4).
88 SD-NO-DATA VALUE SPACE.
01 FILLER REDEFINES SOURCE-DATA.
05 SOURCE-DATA-ALL PIC 9(4).
01 FILLER REDEFINES SOURCE-DATA.
05 SD-LEADING-1 PIC 9.
05 SD-TRAILING-3 PIC X(3).
88 SD-DATA-1-LEADING VALUE SPACE.
01 FILLER REDEFINES SOURCE-DATA.
05 SD-LEADING-2 PIC 99.
05 SD-TRAILING-2 PIC XX.
88 SD-DATA-2-LEADING VALUE SPACE.
01 FILLER REDEFINES SOURCE-DATA.
05 SD-LEADING-3 PIC 9(3).
05 SD-TRAILING-1 PIC X.
88 SD-DATA-3-LEADING VALUE SPACE.
01 DEST-DATA PIC 9(4).
PROCEDURE DIVISION.
MOVE '1234' TO SOURCE-DATA
PERFORM PROCESS-THE-DATA
MOVE '123' TO SOURCE-DATA
PERFORM PROCESS-THE-DATA
MOVE '12' TO SOURCE-DATA
PERFORM PROCESS-THE-DATA
MOVE '1' TO SOURCE-DATA
PERFORM PROCESS-THE-DATA
MOVE SPACE TO SOURCE-DATA
PERFORM PROCESS-THE-DATA
GOBACK
.
PROCESS-THE-DATA.
EVALUATE TRUE
WHEN SD-NO-DATA
MOVE ZERO TO DEST-DATA
WHEN SD-DATA-1-LEADING
MOVE SD-LEADING-1 TO DEST-DATA
WHEN SD-DATA-2-LEADING
MOVE SD-LEADING-2 TO DEST-DATA
WHEN SD-DATA-3-LEADING
MOVE SD-LEADING-3 TO DEST-DATA
WHEN OTHER
MOVE SOURCE-DATA-ALL TO DEST-DATA
END-EVALUATE
DISPLAY 'SOURCE >' SOURCE-DATA '<'
'DEST >' DEST-DATA '<'
.
Что дает:
SOURCE >1234<DEST >1234<
SOURCE >123 <DEST >0123<
SOURCE >12 <DEST >0012<
SOURCE >1 <DEST >0001<
SOURCE > <DEST >0000<