如何一次解析两个字符一次迭代?

时间:2019-06-14 06:37:40

标签: openedge progress-4gl

我有一个匹配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.

如您所见,我做的方法是错误的,我认为它在每次迭代中解析每个字符,但是我需要的是它应该在每次迭代中解析两个字符,以便我们可以匹配“ PP”。您可以通过不同的方式共享或更改逻辑以获得相同的输出

2 个答案:

答案 0 :(得分:4)

很难想象有一个原因一次遍历字符串中的一个字符寻找“ 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 ).

如果有理由一次在一个字符串中使用一个字符,那么我认为它不能包含在您的代码示例或问题中。

在旁注:匹配“ PP *”等效于BEGINS“ PP”。在这种情况下没关系,但是在字符串比较中不必要地抛出MATCHES是一个坏习惯。特别是如果这种习惯最终出现在WHERE子句中。在WHERE子句中使用MATCHES将导致表扫描。几乎总是一个坏主意。

如果您尝试在找到“ PP”的位置之后输出N个字符(而不是硬编码的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 ).

答案 1 :(得分:2)

我不太了解你想做什么。您是否要搜索字符串,看看其中是否有“ 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.