String COBOL将字符串中的字符替换为数字

String COBOL将字符串中的字符替换为数字,string,replace,cobol,String,Replace,Cobol,在COBOL中,我需要用数字替换149个字符的随机字母数字字符串中的每个字符。 1需要替换为4, 2加7等。。。 复杂性在于需要用十位数的数字替换的字符很少: “A”需要替换为19, “B”需要替换为21等 有人能帮忙吗?下面的代码不太有效。我不知道如何解决职位问题 IDENTIFICATION DIVISION. PROGRAM-ID. PROG211. **************************************************

在COBOL中,我需要用数字替换149个字符的随机字母数字字符串中的每个字符。 1需要替换为4, 2加7等。。。 复杂性在于需要用十位数的数字替换的字符很少: “A”需要替换为19, “B”需要替换为21等

有人能帮忙吗?下面的代码不太有效。我不知道如何解决职位问题

   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-202x
FUNCTION SUBSTITUTE
(目前仅在GnuCOBOL和OpenCOBOL中提供)你的解释与你的代码不匹配。我的理解是你想用19161820个显示数字替换SWXY。这是否正确?当你用4替换1时会发生什么?替换4还是04?谢谢你的评论。我现在发布了完整的代码。单个数字和字母很容易,我用INSPECT IN-R替换它们EC转换BF到AF。我有一个问题,需要更换两个字符数。我需要以某种方式输入而不重写其他。字符串将变得更长。Gilbert Le Blanc,是的,你是正确的,SWXY将成为10161820,如果它只有两个数字在行,行将有153焦炭。