String COBOL将字符串中的字符替换为数字
在COBOL中,我需要用数字替换149个字符的随机字母数字字符串中的每个字符。 1需要替换为4, 2加7等。。。 复杂性在于需要用十位数的数字替换的字符很少: “A”需要替换为19, “B”需要替换为21等 有人能帮忙吗?下面的代码不太有效。我不知道如何解决职位问题String COBOL将字符串中的字符替换为数字,string,replace,cobol,String,Replace,Cobol,在COBOL中,我需要用数字替换149个字符的随机字母数字字符串中的每个字符。 1需要替换为4, 2加7等。。。 复杂性在于需要用十位数的数字替换的字符很少: “A”需要替换为19, “B”需要替换为21等 有人能帮忙吗?下面的代码不太有效。我不知道如何解决职位问题 IDENTIFICATION DIVISION. PROGRAM-ID. PROG211. **************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. PROG211.
**************************************************
* DEFINE FILES TO BE BE USED
**************************************************
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO INFILE
FILE STATUS IS WS-IN-STATUS.
SELECT TOTALS-FILE ASSIGN TO OUTTOT
FILE STATUS IS WS-TOTALS-STATUS.
DATA DIVISION.
**************************************************
* DEFINE FILE LAYOUTS
**************************************************
FILE SECTION.
FD IN-FILE RECORDING MODE IS F.
01 IN-REC.
03 IN-BODY PIC X(149).
03 IN-CRLF PIC XX.
FD TOTALS-FILE RECORDING MODE IS F.
*** TOTALS-REC TWICE THE SIZE IN CASE CONVERTING ALL TO TENS DIGITS ***
01 TOTALS-REC.
03 TOTALS-BODY PIC X(298).
03 TOTALS-CRLF PIC XX.
WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC XX.
88 IN-OK VALUE '00'.
88 IN-EOF VALUE '10'.
88 IN-VALID VALUE '00', '10'.
01 WS-TOTALS-STATUS PIC XX.
88 TOTALS-OK VALUE '00'.
01 WS-POS-IN PIC 999.
01 WS-POS-TOT PIC 999.
01 WS-CHARACTERS.
04 BF PIC X(24) VALUE '0123456789EFGHIKMNPQTUVZ'.
04 AF PIC X(24) VALUE '534916820717906256478310'.
PROCEDURE DIVISION.
MAIN-PROCESS SECTION.
PERFORM A-100-INIT
PERFORM B-100-PROCESS UNTIL IN-EOF
PERFORM C-100-TERM
DISPLAY 'PROGRAM FINISHED'
STOP RUN
.
***************************************************
* INITIAL PROCESSING - OPEN FILES
***************************************************
A-100-INIT SECTION.
OPEN INPUT IN-FILE
OUTPUT TOTALS-FILE
IF IN-OK AND TOTALS-OK
CONTINUE
ELSE
DISPLAY 'COULD NOT OPEN FILES'
PERFORM Z-100-UNEXPECTED-ERROR
END-IF
PERFORM Y-100-READ-IN
IF IN-EOF
DISPLAY 'IN FILE IS EMPTY'
END-IF
.
A-100-INIT-RETURN.
EXIT.
***************************************************
* PROCESS EACH RECORD
***************************************************
B-100-PROCESS SECTION.
INSPECT IN-REC
CONVERTING BF
TO AF
MOVE IN-REC TO TOTALS-BODY
MOVE 0 TO WS-POS-IN
MOVE 0 TO WS-POS-TOT
PERFORM VARYING WS-POS-IN FROM 1 BY 1 UNTIL WS-POS-IN > 149
EVALUATE IN-BODY (WS-POS-IN: )
WHEN 'A'
MOVE 21 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'B'
MOVE 17 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'C'
MOVE 13 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'D'
MOVE 15 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'J'
MOVE 11 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'L'
MOVE 31 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'O'
MOVE 23 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'R'
MOVE 19 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'S'
MOVE 10 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'W'
MOVE 16 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'X'
MOVE 18 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'Y'
MOVE 20 TO TOTALS-BODY (WS-POS-TOT: )
END-EVALUATE
END-PERFORM
MOVE X'0D0A' TO TOTALS-CRLF
PERFORM Y-200-WRITE-TOTALS
PERFORM Y-100-READ-MOO
.
B-100-PROCESS-RETURN.
EXIT.
***************************************************
* TERMINATION PROCESSING - CLOSE FILES
***************************************************
C-100-TERM SECTION.
CLOSE IN-FILE
TOTALS-FILE
IF IN-OK AND TOTALS-OK
CONTINUE
ELSE
DISPLAY 'COULD NOT CLOSE FILES'
PERFORM Z-100-UNEXPECTED-ERROR
END-IF
.
C-100-TERM-RETURN.
EXIT.
***************************************************
* READ RECORD
***************************************************
Y-100-READ-IN SECTION.
READ IN-FILE
IF NOT IN-VALID
DISPLAY 'COULD NOT READ IN RECORD'
PERFORM Z-100-UNEXPECTED-ERROR
END-IF
.
Y-100-READ-IN-RETURN.
EXIT.
***************************************************
* WRITE IN RECORD
***************************************************
Y-200-WRITE-TOTALS SECTION.
WRITE TOTALS-REC
IF NOT TOTALS-OK
DISPLAY 'COULD NOT WRITE TOTALS RECORD'
PERFORM Z-100-UNEXPECTED-ERROR
END-IF
.
Y-200-WRITE-TOTALS-RETURN.
EXIT.
***************************************************
* UNEXPECTED ERROR SECTION
***************************************************
Z-100-UNEXPECTED-ERROR SECTION.
DISPLAY 'IN STATUS IS ' WS-IN-STATUS
DISPLAY 'TOTALS STATUS IS ' WS-TOTALS-STATUS
STOP RUN
.
Z-100-TERM-RETURN.
EXIT.
我选择使用一种通用技术将一个字符和两个字符的翻译放入输出中。为此,我创建了一个表,在一个位置定义所有翻译,使用
SEARCH
查找特定翻译,并使用INSTRING
将翻译放入输出
为了测试代码,我将字段的大小减少到9和18个位置
IDENTIFICATION DIVISION.
PROGRAM-ID. PROG211.
**************************************************
* DEFINE FILES TO BE BE USED
**************************************************
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO INFILE
FILE STATUS IS WS-IN-STATUS.
SELECT TOTALS-FILE ASSIGN TO OUTTOT
FILE STATUS IS WS-TOTALS-STATUS.
DATA DIVISION.
**************************************************
* DEFINE FILE LAYOUTS
**************************************************
FILE SECTION.
FD IN-FILE RECORDING MODE IS F.
01 IN-REC.
03 IN-BODY PIC X(149).
03 IN-CRLF PIC XX.
FD TOTALS-FILE RECORDING MODE IS F.
*** TOTALS-REC TWICE THE SIZE IN CASE CONVERTING ALL TO TENS DIGITS ***
01 TOTALS-REC.
03 TOTALS-BODY PIC X(298).
03 TOTALS-CRLF PIC XX.
WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC XX.
88 IN-OK VALUE '00'.
88 IN-EOF VALUE '10'.
88 IN-VALID VALUE '00', '10'.
01 WS-TOTALS-STATUS PIC XX.
88 TOTALS-OK VALUE '00'.
01 WS-POS-IN PIC 999.
01 WS-POS-TOT PIC 999.
01 WS-CHARACTERS.
04 BF PIC X(24) VALUE '0123456789EFGHIKMNPQTUVZ'.
04 AF PIC X(24) VALUE '534916820717906256478310'.
PROCEDURE DIVISION.
MAIN-PROCESS SECTION.
PERFORM A-100-INIT
PERFORM B-100-PROCESS UNTIL IN-EOF
PERFORM C-100-TERM
DISPLAY 'PROGRAM FINISHED'
STOP RUN
.
***************************************************
* INITIAL PROCESSING - OPEN FILES
***************************************************
A-100-INIT SECTION.
OPEN INPUT IN-FILE
OUTPUT TOTALS-FILE
IF IN-OK AND TOTALS-OK
CONTINUE
ELSE
DISPLAY 'COULD NOT OPEN FILES'
PERFORM Z-100-UNEXPECTED-ERROR
END-IF
PERFORM Y-100-READ-IN
IF IN-EOF
DISPLAY 'IN FILE IS EMPTY'
END-IF
.
A-100-INIT-RETURN.
EXIT.
***************************************************
* PROCESS EACH RECORD
***************************************************
B-100-PROCESS SECTION.
INSPECT IN-REC
CONVERTING BF
TO AF
MOVE IN-REC TO TOTALS-BODY
MOVE 0 TO WS-POS-IN
MOVE 0 TO WS-POS-TOT
PERFORM VARYING WS-POS-IN FROM 1 BY 1 UNTIL WS-POS-IN > 149
EVALUATE IN-BODY (WS-POS-IN: )
WHEN 'A'
MOVE 21 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'B'
MOVE 17 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'C'
MOVE 13 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'D'
MOVE 15 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'J'
MOVE 11 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'L'
MOVE 31 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'O'
MOVE 23 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'R'
MOVE 19 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'S'
MOVE 10 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'W'
MOVE 16 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'X'
MOVE 18 TO TOTALS-BODY (WS-POS-TOT: )
WHEN 'Y'
MOVE 20 TO TOTALS-BODY (WS-POS-TOT: )
END-EVALUATE
END-PERFORM
MOVE X'0D0A' TO TOTALS-CRLF
PERFORM Y-200-WRITE-TOTALS
PERFORM Y-100-READ-MOO
.
B-100-PROCESS-RETURN.
EXIT.
***************************************************
* TERMINATION PROCESSING - CLOSE FILES
***************************************************
C-100-TERM SECTION.
CLOSE IN-FILE
TOTALS-FILE
IF IN-OK AND TOTALS-OK
CONTINUE
ELSE
DISPLAY 'COULD NOT CLOSE FILES'
PERFORM Z-100-UNEXPECTED-ERROR
END-IF
.
C-100-TERM-RETURN.
EXIT.
***************************************************
* READ RECORD
***************************************************
Y-100-READ-IN SECTION.
READ IN-FILE
IF NOT IN-VALID
DISPLAY 'COULD NOT READ IN RECORD'
PERFORM Z-100-UNEXPECTED-ERROR
END-IF
.
Y-100-READ-IN-RETURN.
EXIT.
***************************************************
* WRITE IN RECORD
***************************************************
Y-200-WRITE-TOTALS SECTION.
WRITE TOTALS-REC
IF NOT TOTALS-OK
DISPLAY 'COULD NOT WRITE TOTALS RECORD'
PERFORM Z-100-UNEXPECTED-ERROR
END-IF
.
Y-200-WRITE-TOTALS-RETURN.
EXIT.
***************************************************
* UNEXPECTED ERROR SECTION
***************************************************
Z-100-UNEXPECTED-ERROR SECTION.
DISPLAY 'IN STATUS IS ' WS-IN-STATUS
DISPLAY 'TOTALS STATUS IS ' WS-TOTALS-STATUS
STOP RUN
.
Z-100-TERM-RETURN.
EXIT.
我在这个最小的工作示例()中使用小写表示所有重要的更改
输出:
012345678
534916820
9ABCDEFGH
7211713151790
IJKLMNOPQ
611231562347
RSTUVWXYZ
19108311618200
当然由于这不是编码方面,请显示您的代码和卡住的地方(您可能会使用
PERFORM
对源数据进行迭代,或者使用COBOL-202xFUNCTION SUBSTITUTE
(目前仅在GnuCOBOL和OpenCOBOL中提供)你的解释与你的代码不匹配。我的理解是你想用19161820个显示数字替换SWXY。这是否正确?当你用4替换1时会发生什么?替换4还是04?谢谢你的评论。我现在发布了完整的代码。单个数字和字母很容易,我用INSPECT IN-R替换它们EC转换BF到AF。我有一个问题,需要更换两个字符数。我需要以某种方式输入而不重写其他。字符串将变得更长。Gilbert Le Blanc,是的,你是正确的,SWXY将成为10161820,如果它只有两个数字在行,行将有153焦炭。