我有一个匹配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”。您可以通过不同的方式共享或更改逻辑以获得相同的输出
答案 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”的情况。您应该尝试更好地准确解释您的追求。
如果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.