COBOL:从字符串中删除某些字符

问题描述 投票:1回答:2

我想从COBOL中的字符串中删除某些字符。例如,“ ****这是*测试**字符串”。将变为“这是一个测试字符串”。“第二”将变为“第二个”。

string cobol
2个回答
1
投票

虽然INSPECT ... REPLACING无法更改数据项中字符的位置,但INSPECT ... CONVERTING可用于准备数据项以用于后续操作。

[下面,过程strip-string首先将所有要替换的字符转换为单个公共字符,在这种情况下为LOW-VALUES。这会分割字符串,以便可以使用公共字符轻松地分隔片段。 PERFORM在片段字符串上循环。 UNSTRING语句将一个片段移动到输出,并提供已移动字符数的COUNTADD增加输出的起始位置,以便片段按顺序放置。


代码:

   data division.
   working-storage section.
   1 binary.
    2 p pic 9(4).
    2 o pic 9(4).
    2 o-count pic 9(4).
   1 i-string pic x(40).
     88 test-1 value '****This is*a test** string.'.
     88 test-2 value '"Second one"'.
   1 o-string pic x(40).
   1 r-chars pic x(2) value '*"'. *> characters to be removed
   procedure division.
   begin.
       set test-1 to true
       perform test-prep
       set test-2 to true
       perform test-prep
       stop run
       .

   test-prep.
       display i-string
       perform strip-string
       display o-string
       display space
       .

   strip-string.
       inspect i-string converting r-chars to low-values
       move 1 to p o
       perform until p > function length (i-string)
           unstring i-string
               delimited all low-values
               into o-string (o:)
               count in o-count
               with pointer p
           add o-count to o
       end-perform
       .

输出:

****This is*a test** string.
This isa test string.

"Second one"
Second one

1
投票

尝试以下代码段。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD. 
DATA DIVISION.
WORKING-STORAGE SECTION. 
01 WS-STR PIC X(20) VALUE '****This is*a test**'. 
01 WS-CNT PIC 99 VALUE 0.
01 WS-I PIC 99 VALUE 0.
01 WS-J PIC 99 VALUE 1.
01 WS-CHAR.
   05 WS-LETTER OCCURS 1 TO 20 TIMES DEPENDING ON WS-CNT PIC X.
PROCEDURE DIVISION. 
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > FUNCTION LENGTH(WS-STR)
IF WS-STR(WS-I:1) = '*' THEN
CONTINUE
ELSE
MOVE WS-STR(WS-I:1) TO WS-LETTER(WS-J)
ADD 1 TO WS-J
ADD 1 TO WS-CNT
END-IF
END-PERFORM
DISPLAY WS-CHAR
STOP RUN.

输出:

This isa test

注意:我使用Tutorial Point的COBOL编码基础来运行上述代码段。不需要在此处缩排COBOL代码。

© www.soinside.com 2019 - 2024. All rights reserved.