Как анализировать два символа одновременно для одной итерации? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть письменный запрос на совпадение 2 символов и парсинг данных, но я чувствую, что я поступил неправильно.Позвольте мне поделиться с вами моей логикой

DEFINE VARIABLE I                   AS INTEGER   NO-UNDO.
DEFINE VARIABLE cData               AS CHARACTER NO-UNDO.
DEFINE VARIABLE cParsData           AS CHARACTER NO-UNDO.

ASSIGN
       cData = 'PRRSCLPP0123456789'.

DO I = 1 TO LENGTH(cData):

   cParsData = SUBSTRING(cData,I).
   IF cParsData MATCHES 'PP*' THEN MESSAGE SUBSTRING(cParsData,4,9).

END.

Как вы видите, я поступил неправильно, и я думаю, что он анализирует каждый символ за итерацию, но мне нужно, чтобы он анализировал два символа за итерацию, чтобы мы моглисоответствует "ПП".Вы можете поделиться или изменить логику для разных способов получить один и тот же вывод

Ответы [ 2 ]

4 голосов
/ 14 июня 2019

Трудно представить причину для перебора строки по одному символу за раз в поисках «PP», а затем выплевывания символов с 4 по 13. Было бы намного проще сделать это:

define variable myData  as character no-undo.
define variable foundIt as integer   no-undo.

myData = "PRRSCLPP0123456789".

foundIt = index( myData, "PP" ).
if foundIt > 0 then 
  message substring( myData, 4, 9 ).

Если есть причина проходить эту строку по одному символу за раз, я думаю, что она не должна содержаться в вашем примере кода или вопросе.

С другой стороны: МАТЧИ "ПП *" эквивалентноНАЧИНАЕТСЯ "ПП".В этом случае это не имеет большого значения, но это плохая привычка - без необходимости бросать МАТЧИ при сравнении строк.Особенно, если эта привычка заканчивается в предложении WHERE.Использование MATCHES в предложениях WHERE приведет к сканированию таблицы.Что почти всегда является плохой идеей.

Если вы пытаетесь вывести N символов после позиции, в которой было найдено «PP» (а не в жестко заданных 4–13), вы бы сделали это так (при условиичто n = 9):

define variable myData  as character no-undo.
define variable foundIt as integer   no-undo.

myData = "PRRSCLPP0123456789".

foundIt = index( myData, "PP" ).
if foundIt > 0 then 
  message substring( myData, foundIt + 1, 9 ).
2 голосов
/ 14 июня 2019

Я не совсем понимаю, что вы хотите сделать. Вы хотите найти строку и посмотреть, есть ли в ней "PP"? Тогда вам не нужно делать это в итерации. Просто

cData MATCHES "*PP*" скажет вам это.

Если «PP» - это какой-то разделитель, и вы хотите что-то сделать с данными до и после того, как вы можете сделать:

DEFINE VARIABLE I                   AS INTEGER   NO-UNDO.
DEFINE VARIABLE cData               AS CHARACTER NO-UNDO .
DEFINE VARIABLE cParsData           AS CHARACTER NO-UNDO.

ASSIGN
   cData = 'PRRSCLPP0123456789'.

DO I = 1 TO LENGTH(cData):

    cParsData = SUBSTRING(cData,I, 2).
    IF cParsData = 'PP' THEN DO:
        DISPLAY 
            SUBSTRING(cData, i + 2)    FORMAT "x(20)" LABEL "After PP" 
            SUBSTRING(cData, 1, i - 1) FORMAT "x(20)" LABEL "Before PP".
    END.

END.

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

Вы оставили намного больше информации в комментарии к другому ответу: Comment

Если PP действительно всегда находится в позиции 10 (и 11) или 20 (и 21) и вам нужны только следующие 10 символов, тогда вы можете сделать:

DEFINE VARIABLE cData1 AS CHARACTER NO-UNDO.
DEFINE VARIABLE cData2 AS CHARACTER NO-UNDO.
/* Position 10 and 11 */
cData1 = 'PRRSCLAAAPP0123456789'.
/* Position 20 and 21 */
cData2 = 'PRRSCLAAAPRRSCLAAAPP9876543210AA'.

FUNCTION parse  RETURNS CHARACTER 
    (INPUT cString AS CHARACTER ):
    IF INDEX(cString, "PP") > 0 THEN 
        RETURN SUBSTRING(cString, INDEX(cString, "PP") + 2, 10 ).
    ELSE 
        RETURN "".

END.

 MESSAGE cData1 " ->" parse(cData1) SKIP
         cData2 " ->" parse(cData2) VIEW-AS ALERT-BOX.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...