Удалить определенные значения из строки в коболе - PullRequest
0 голосов
/ 06 ноября 2018

Хотелось бы спросить, как удалить из строки определенные значения разной длины.

У меня есть это: '{4: 72: SELLS¬ #: 73: ABC¬ #: PPF: TESTPPF¬ #: 74: BLA¬ #: ППФ: ABC¬ #: 74: BLA¬ # -}'

(хочу удалить все ¬ #: PPF: Теги с их содержимым. В моем примере это должно быть удалено:

  • ¬ #: PPF: TESTPPF
  • ¬ #: PPF: ABC )

И хотел бы иметь это: '{4: 72: SELLS¬ #: 73: ABC¬ #: 74: BLA¬ #: 74: BLA¬ # -}'

У меня есть этот код:

01 TINP.
    05 TINPFIELD                         PIC  X(2000) VALUE
       '{4:72:SELLS¬#:73:ABC¬#:PPF:TESTPPF¬#:74:BLA¬#:PPF:TESTPPF¬#:74:BLA¬#-}'.

01 WA-OUTPUT    PIC X(2000) value spaces.
01 WA-TEMP      PIC X(2500).
01 WP-MSG       PIC 9(8) BINARY value zero.
01 WN-ROWCNT    PIC S9(8) BINARY.
01 WN-ROWCNT2   PIC S9(8) BINARY.
01 WP-BEG       PIC 9(8) BINARY.
01 WP-END       PIC 9(8) BINARY.
01 WN-OUT-LEN   PIC 9(8) BINARY value zero.

0000-TESTPROCESSING SECTION.

    display TINPFIELD.

    INSPECT TINPFIELD
            TALLYING WN-Rowcnt FOR ALL "¬#".

    MOVE 1 TO WP-MSG

    PERFORM UNTIL WN-ROWCNT2 >= WN-ROWCNT

      MOVE WP-MSG TO WP-BEG
      display 'WP-BEG' WP-BEG

      UNSTRING TINPFIELD
        DELIMITED BY "¬#"
        INTO WA-TEMP
        POINTER WP-MSG
      END-UNSTRING

      MOVE WP-MSG TO WP-END
      display 'WP-END' WP-END

      if WA-OUTPUT = space
        subtract 1 from wp-end
        STRING TINPFIELD(WP-BEG:WP-END)
               delimited by SIZE
               INTO WA-OUTPUT
        END-STRING
        move wp-end to WN-OUT-LEN
       else
         STRING WA-OUTPUT(1:WN-OUT-LEN)
                delimited by SIZE
                TINPFIELD(WP-BEG:WP-END)
                delimited by SIZE
                '¬#'
                delimited by SIZE
                INTO WA-OUTPUT
         END-STRING
       end-if

       move WP-END TO WN-OUT-LEN
       display 'WN-OUT-LEN' WN-OUT-LEN

       ADD 1 TO WN-ROWCNT2

     END-Perform
     .
     EXIT.

// edit: входные данные всегда одинаковы. В выводе (после выполнения моего кода) у меня иногда есть «тег» дважды, иногда только один раз и так далее. Это не соответствует вообще. Я полагаю, что это проблема с кодом на моей стороне.

1 Ответ

0 голосов
/ 06 ноября 2018

Код был изменен, чтобы отразить изменение в вопросе.

Этот код разбивает входные данные на сегменты с разделителями, копируя каждый сегмент непосредственно в выходные данные, используя модификацию ссылок. Если текст для удаления отсутствует (без разделителя), он скопирует весь ввод непосредственно в вывод.

Этот метод влияет на производительность. В частности, перемещение каждого сегмента приведет к заполнению пространства на выходе. Чем больше количество сегментов, тем хуже производительность.

Я изменил WA-OUTPUT на X(2000), поскольку выход никогда не может быть больше, чем вход.

   01 TINP.
       05 TINPFIELD                         PIC  X(2000) VALUE
           '{4:72:SELLS¬#:73:ABC¬#:PPF:TESTPPF¬#:74:BLA' &
           '¬#:PPF:TESTPPF¬#:74:BLA¬#-}'.

   01 WA-OUTPUT    PIC X(2000) value spaces.
   01 segment-length binary pic 9(4).
   01 additional-characters binary pic 9(4).
   01 input-pointer binary pic 9(4).
   01 output-pointer binary pic 9(4).
   01 input-length binary pic 9(4).
   01 output-length binary pic 9(4).
   procedure division.
   begin.
       move 1 to input-pointer output-pointer
                 input-length output-length
       inspect TINPFIELD tallying
           input-length for characters before "}".
       display input-length
       display TINPFIELD
       perform until input-pointer > function length(TINPFIELD)
           unstring TINPFIELD delimited "¬#:PPF:"
               into WA-OUTPUT (output-pointer:)
               count in segment-length
               with pointer input-pointer
           add segment-length to output-pointer
           if input-pointer <= function length(TINPFIELD)
               move 0 to additional-characters
               inspect TINPFIELD (input-pointer:) tallying
                   additional-characters for characters before "¬"
               add additional-characters to input-pointer
           end-if
       end-perform
       inspect WA-OUTPUT tallying
           output-length for characters before "}".
       display wa-output
       display output-length
       goback
       .

Выход:

0070
{4:72:SELLS¬#:73:ABC¬#:PPF:TESTPPF¬#:74:BLA¬#:PPF:TESTPPF¬#:74:BLA¬#-}
{4:72:SELLS¬#:73:ABC¬#:74:BLA¬#:74:BLA¬#-}
0042

Это - модификация вышеупомянутого, которая, хотя и немного более сложная, устраняет снижение производительности при заполнении пространства, когда имеется большее количество сегментов. Это необычно, потому что, хотя оно использует оператор UNSTRING, оно на самом деле ничего не «натягивает».

   01 TINP.
       05 TINPFIELD                         PIC  X(2000) VALUE
           '{4:72:SELLS¬#:73:ABC¬#:PPF:TESTPPF¬#:74:BLA' &
           '¬#:PPF:TESTPPF¬#:74:BLA¬#-}'.

   01 WA-OUTPUT    PIC X(2000) value spaces.
   01 segment-length binary pic 9(4).
   01 segment-holder pic x.
   01 additional-characters binary pic 9(4).
   01 input-pointer binary pic 9(4).
   01 backup-pointer binary pic 9(4).
   01 output-pointer binary pic 9(4).
   01 input-length binary pic 9(4).
   01 output-length binary pic 9(4).
   procedure division.
   begin.
       move 1 to input-pointer output-pointer
                 input-length output-length
       inspect TINPFIELD tallying
           input-length for characters before "}".
       display input-length
       display TINPFIELD
       perform until input-pointer > function length(TINPFIELD)
           move input-pointer to backup-pointer
           unstring TINPFIELD delimited "¬#:PPF:"
               into segment-holder
               count in segment-length
               with pointer input-pointer
           move TINPFIELD (backup-pointer:segment-length)
               to WA-OUTPUT (output-pointer:segment-length)
           add segment-length to output-pointer
           if input-pointer <= function length(TINPFIELD)
               move 0 to additional-characters
               inspect TINPFIELD (input-pointer:) tallying
                   additional-characters for characters before "¬"
               add additional-characters to input-pointer
           end-if
       end-perform
       if output-pointer < function length (WA-OUTPUT)
           move space to WA-OUTPUT (output-pointer:)
       inspect WA-OUTPUT tallying
           output-length for characters before "}".
       display wa-output
       display output-length
       goback
       .

Вывод такой же.

...