Попытка сканирования текстового поля для нескольких префиксов, чтобы удалить их

В настоящее время я пытаюсь создать программу, в которой курсор читает поля var char таблицы «описание» DB2 и курсор, который читает поле var char «префикс» из другой таблицы. Затем мне нужно проверить каждое описание, чтобы увидеть, существует ли какой-либо из префиксов в начале описания, и если он существует, заменить его одним пробелом.

Значения рабочего хранилища для них:

03 WS-PFIX.
   49 WS-PFIX-LEN   PIC S9(4) COMP.
   49 WS-PFIX-TEXT

03 WS-DESC.
       49 WS-DESC-LEN   PIC S9(4) COMP.
       49 WS-DESC-TEXT  PIC X(100). 

Я пробовал следующий код:

INSPECT WS-DESC-TEXT(1:WS-PFIX-LEN)
REPLACING WS-PFIX-TEXT TO " "

Это не работает, потому что WS-PFIX-TEXT имеет фиксированную длину в 100 символов, поэтому совпадения нет, так как он включает в сравнение все конечные пробелы. Я также пробовал это:

INSPECT WS-DESC-TEXT(1:WS-PFIX-LEN)
REPLACING WS-PFIX-TEXT(1:WS-PFIX-LEN) TO " "

Но компилятору не нравится использование подстроки в строке REPLACING.

Кто-нибудь знает какие-либо альтернативы, которые можно использовать для этого, которые будут работать? Я рыскал по интернету целую вечность и ничего не мог найти.

Спасибо


person mmackenzie93    schedule 19.09.2017    source источник


Ответы (1)


Есть еще одна проблема, которая возникла бы, даже если бы подстрока работала. Текст, который вы проверяете, во многом совпадает (по длине) с текстом, которым вы его заменяете.

При этом вы всегда можете сделать это логически:

03 WS-PFIX.
   49 WS-PFIX-LEN   PIC S9(4) COMP.
   49 WS-PFIX-TEXT  PIC X(100).

03 WS-DESC.
   49 WS-DESC-LEN   PIC S9(4) COMP.
   49 WS-DESC-TEXT  PIC X(100).

03 WS-TEMP.
   49 WS-TEMP-LEN   PIC S9(4) COMP.
   49 WS-TEMP-TEXT  PIC X(100).

MOVE 0      TO WS-TEMP-LEN
MOVE SPACES TO WS-TEMP-TEXT

IF WS-DESC-TEXT(1:WS-PFIX-LEN) = WS-PFIX-TEXT(1:WS-PFIX-LEN)
   ADD 1 TO WS-TEMP-LEN
   MOVE SPACE TO WS-TEMP-TEXT(1:1)
   ADD 1 TO WS-TEMP-LEN
   MOVE WS-DESC-TEXT(WS-PFIX-LEN + 1:) TO WS-TEMP-TEXT(2:)

   COMPUTE
      WS-TEMP-LEN = (WS-DESC-LEN - WS-PFIX-LEN) + 1
   END-COMPUTE
ELSE
   MOVE WS-DESC-TEXT TO WS-TEMP-TEXT
   MOVE WS-DESC-LEN  TO WS-TEMP-LEN
END-IF

MOVE SPACES       TO WS-DESC-TEXT
MOVE 0            TO WS-DESC-LEN

MOVE WS-TEMP-TEXT TO WS-DESC-TEXT
MOVE WS-TEMP-LEN  TO WS-DESC-LEN

Еще я заметил, что даже если ваш оператор проверки работает, WS-DESC-LEN будет неправильным, потому что вы заменяете несколько символов одним пробелом.

Это должно делать то, что вы хотите. У меня нет возможности проверить это, поэтому мои расчеты могут быть немного ошибочными. Это в основном то, что вы хотите сделать.

person SaggingRufus    schedule 20.09.2017
comment
Приветствую ответ, просто сделал это логически, в конце концов, он просто заменил начало описания пробелами, если оно соответствовало префиксу. Я на самом деле настраиваю программу, которая делает что-то похожее, чтобы соответствовать тому, что я хочу, и включает отдельный раздел для удаления нескольких вхождений пробелов и обновления длины по мере продвижения. Большое спасибо за помощь! - person mmackenzie93; 21.09.2017