Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何在openedge 4gl中提取由分隔符分隔的字符串?_String_Loops_Progress 4gl_Openedge - Fatal编程技术网

String 如何在openedge 4gl中提取由分隔符分隔的字符串?

String 如何在openedge 4gl中提取由分隔符分隔的字符串?,string,loops,progress-4gl,openedge,String,Loops,Progress 4gl,Openedge,我有一根绳子 v-edistring = "STS++56+202:::DUE TO HOLIDAY1'STS++56+202:::DUE TO HOLIDAY2'STS++56+202:::DUE TO HOLIDAY3'" 撇号(')表示线的终止,每条线都是一段。我提取了每个段并将其分配给变量段 现在,对于每个片段,我需要循环查找元素(STS,56,202,由于HOLIDAY1)等 DEFINE VARIABLE v-edistring AS CHARACTER NO-UNDO.

我有一根绳子

v-edistring  = "STS++56+202:::DUE TO HOLIDAY1'STS++56+202:::DUE TO HOLIDAY2'STS++56+202:::DUE TO HOLIDAY3'" 
撇号(')表示线的终止,每条线都是一段。我提取了每个段并将其分配给变量段

现在,对于每个片段,我需要循环查找元素(STS,56,202,由于HOLIDAY1)等

DEFINE VARIABLE v-edistring  AS CHARACTER   NO-UNDO.
DEFINE VARIABLE v-cnt AS INTEGER     NO-UNDO.
DEFINE VARIABLE segment AS CHARACTER   NO-UNDO.

v-edistring = "STS++56+202:::DUE TO HOLIDAY1'STS++56+202:::DUE TO HOLIDAY2'STS++56+202:::DUE TO HOLIDAY3'".

DO  v-cnt = 1 TO num-entries(v-edistring, "'") - 1  :

    ASSIGN segment = string(entry(v-cnt, v-edistring, "'")).

   MESSAGE segment
       VIEW-AS ALERT-BOX INFO BUTTONS OK.

  /* FOR EACH segment */
  /*DO:

  alert STS then alert 56 then 202 then due to holiday ( ie loop for elements )

  END. */
END.

这不是很优雅,我假设您的分隔符与您暗示的一致,但现在您开始

DEF VAR iCnt      AS INT  NO-UNDO.
DEF VAR ediString AS CHAR NO-UNDO.
DEF VAR segment   AS CHAR NO-UNDO.
DEF VAR iLoop     AS INT  NO-UNDO.
DEF VAR iLoop2     AS INT  NO-UNDO.
DEF VAR cSubString AS CHAR NO-UNDO.
DEF VAR cSubString2 AS CHAR NO-UNDO.
DEF VAR cValue      AS CHAR NO-UNDO.
DEF VAR iEntry      AS INT  NO-UNDO.
DEF TEMP-TABLE fred
  FIELD ParentID AS INT
  FIELD STRINGID AS INT
  FIELD ParseID  AS INT
  Field ParseValue    AS CHAR FORMAT "X(20)".
ediString = "STS++56+202:::DUE TO HOLIDAY1'STS++56+202:::DUE TO HOLIDAY2'STS++56+202:::DUE TO HOLIDAY3'". 

FUNCTION getEntry RETURNS INT ():
  iEntry = iEntry + 1.
  RETURN iEntry.
END.

DO  iCnt = 1 TO num-entries(ediString, "'") - 1  :

    ASSIGN segment = string(entry(iCnt, ediString, "'"))
           iEntry = 0.
  REPEAT iLoop = 1 TO NUM-ENTRIES(segment,"+"):


    cSubString =  ENTRY(iLoop,segment,"+").

    IF cSubString MATCHES "*:*" THEN
    DO:

      REPEAT iLoop2 = 1 TO  NUM-ENTRIES(cSubString,":"):

        cSubString2 =  ENTRY(iLoop2,cSubString,":").

        if cSubString2 = "" THEN NEXT.
        CREATE fred.
        ASSIGN  
          fred.ParentID = iCnt
          fred.StringID = iLoop
          fred.ParseID  = getEntry()
          fred.parseValue = cSubString2.
          cSubString2 = "".

      END.
    END. 
    ELSE
    DO:
     IF cSubString <> "" THEN
     DO:
       CREATE fred.
        ASSIGN  
          fred.ParentID = iCnt
          fred.StringID = iLoop
          fred.ParseID  = getEntry()
          fred.ParseValue = cSubString.
     END.
    END.


  END. 
END.

for each fred:
    display fred.
END.
将变量iCnt定义为INT NO-UNDO。
DEF VAR ediString作为CHAR NO-UNDO。
DEF VAR段作为CHAR NO-UNDO。
DEF VAR iLoop作为INT NO-UNDO。
DEF VAR ILOP2作为INT NO-UNDO。
DEF VAR cSubString作为CHAR NO-UNDO。
DEF VAR cSubString2作为字符NO-UNDO。
DEF VAR C值为CHAR NO-UNDO。
定义变量为INT NO-UNDO。
DEF温度表fred
字段ParentID为INT
字段STRINGID为INT
字段ParseID为INT
字段值解析为字符格式“X(20)”。
ediString=“STS++56+202:::由于假期1'STS++56+202:::由于假期2'STS++56+202:::由于假期3'”。
函数getEntry返回INT():
iEntry=iEntry+1。
回首往事。
结束。
DO iCnt=1到num条目(ediString,“”)-1:
分配段=字符串(条目(iCnt,ediString,“”))
iEntry=0。
对NUM-ENTRIES(段“+”)重复iLoop=1:
cSubString=条目(iLoop,段“+”)。
如果cSubString与“*:*”匹配,则
做:
对NUM-ENTRIES(cSubString,“:”)重复iLoop2=1:
cSubString2=ENTRY(iLoop2,cSubString,“:”)。
如果cSubString2=“”,则下一步。
创造弗雷德。
分配
fred.ParentID=iCnt
fred.StringID=iLoop
fred.ParseID=getEntry()
fred.parseValue=cSubString2。
cSubString2=”“。
结束。
结束。
其他的
做:
如果cSubString“”则
做:
创造弗雷德。
分配
fred.ParentID=iCnt
fred.StringID=iLoop
fred.ParseID=getEntry()
fred.ParseValue=cSubString。
结束。
结束。
结束。
结束。
对于每个fred:
显示弗雷德。
结束。

这不是很优雅,我假设您的分隔符与您所暗示的一致,但现在

DEF VAR iCnt      AS INT  NO-UNDO.
DEF VAR ediString AS CHAR NO-UNDO.
DEF VAR segment   AS CHAR NO-UNDO.
DEF VAR iLoop     AS INT  NO-UNDO.
DEF VAR iLoop2     AS INT  NO-UNDO.
DEF VAR cSubString AS CHAR NO-UNDO.
DEF VAR cSubString2 AS CHAR NO-UNDO.
DEF VAR cValue      AS CHAR NO-UNDO.
DEF VAR iEntry      AS INT  NO-UNDO.
DEF TEMP-TABLE fred
  FIELD ParentID AS INT
  FIELD STRINGID AS INT
  FIELD ParseID  AS INT
  Field ParseValue    AS CHAR FORMAT "X(20)".
ediString = "STS++56+202:::DUE TO HOLIDAY1'STS++56+202:::DUE TO HOLIDAY2'STS++56+202:::DUE TO HOLIDAY3'". 

FUNCTION getEntry RETURNS INT ():
  iEntry = iEntry + 1.
  RETURN iEntry.
END.

DO  iCnt = 1 TO num-entries(ediString, "'") - 1  :

    ASSIGN segment = string(entry(iCnt, ediString, "'"))
           iEntry = 0.
  REPEAT iLoop = 1 TO NUM-ENTRIES(segment,"+"):


    cSubString =  ENTRY(iLoop,segment,"+").

    IF cSubString MATCHES "*:*" THEN
    DO:

      REPEAT iLoop2 = 1 TO  NUM-ENTRIES(cSubString,":"):

        cSubString2 =  ENTRY(iLoop2,cSubString,":").

        if cSubString2 = "" THEN NEXT.
        CREATE fred.
        ASSIGN  
          fred.ParentID = iCnt
          fred.StringID = iLoop
          fred.ParseID  = getEntry()
          fred.parseValue = cSubString2.
          cSubString2 = "".

      END.
    END. 
    ELSE
    DO:
     IF cSubString <> "" THEN
     DO:
       CREATE fred.
        ASSIGN  
          fred.ParentID = iCnt
          fred.StringID = iLoop
          fred.ParseID  = getEntry()
          fred.ParseValue = cSubString.
     END.
    END.


  END. 
END.

for each fred:
    display fred.
END.
将变量iCnt定义为INT NO-UNDO。
DEF VAR ediString作为CHAR NO-UNDO。
DEF VAR段作为CHAR NO-UNDO。
DEF VAR iLoop作为INT NO-UNDO。
DEF VAR ILOP2作为INT NO-UNDO。
DEF VAR cSubString作为CHAR NO-UNDO。
DEF VAR cSubString2作为字符NO-UNDO。
DEF VAR C值为CHAR NO-UNDO。
定义变量为INT NO-UNDO。
DEF温度表fred
字段ParentID为INT
字段STRINGID为INT
字段ParseID为INT
字段值解析为字符格式“X(20)”。
ediString=“STS++56+202:::由于假期1'STS++56+202:::由于假期2'STS++56+202:::由于假期3'”。
函数getEntry返回INT():
iEntry=iEntry+1。
回首往事。
结束。
DO iCnt=1到num条目(ediString,“”)-1:
分配段=字符串(条目(iCnt,ediString,“”))
iEntry=0。
对NUM-ENTRIES(段“+”)重复iLoop=1:
cSubString=条目(iLoop,段“+”)。
如果cSubString与“*:*”匹配,则
做:
对NUM-ENTRIES(cSubString,“:”)重复iLoop2=1:
cSubString2=ENTRY(iLoop2,cSubString,“:”)。
如果cSubString2=“”,则下一步。
创造弗雷德。
分配
fred.ParentID=iCnt
fred.StringID=iLoop
fred.ParseID=getEntry()
fred.parseValue=cSubString2。
cSubString2=”“。
结束。
结束。
其他的
做:
如果cSubString“”则
做:
创造弗雷德。
分配
fred.ParentID=iCnt
fred.StringID=iLoop
fred.ParseID=getEntry()
fred.ParseValue=cSubString。
结束。
结束。
结束。
结束。
对于每个fred:
显示弗雷德。
结束。

此解决方案可能不是最好的,但假设您所展示的模式,我认为这可以帮助您

DEF TEMP-TABLE tt-data NO-UNDO
    FIELD sequence      AS INT
    FIELD string-1      AS CHAR FORMAT 'x(20)'
    FIELD string-2      AS CHAR FORMAT 'x(20)'
    FIELD string-3      AS CHAR FORMAT 'x(20)'
    FIELD string-4      AS CHAR FORMAT 'x(20)'
    INDEX ch-unique IS PRIMARY UNIQUE
        sequence.

DEF VAR i-seq           AS INT  NO-UNDO INIT 0.
DEF VAR c-aux           AS CHAR NO-UNDO EXTENT 4.
DEF VAR i-count         AS INT  NO-UNDO.
DEF VAR c-source        AS CHAR NO-UNDO.
DEF VAR c-data          AS CHAR NO-UNDO
    INIT "STS++56+202:::DUE TO HOLIDAY1'STS++56+202:::DUE TO HOLIDAY2'STS++56+202:::DUE TO HOLIDAY3'".

DO i-count = 1 TO NUM-ENTRIES(c-data,"'"):

    ASSIGN c-source = ENTRY(i-count,c-data,"'").

    IF TRIM(c-source)               = '' OR
       NUM-ENTRIES(c-source,'+')   <> 4  THEN
        NEXT.

    ASSIGN c-aux[1] = ENTRY(1,c-source,'+')
           c-aux[2] = ENTRY(3,c-source,'+')
           c-aux[3] = ENTRY(1,ENTRY(4,c-source,'+'),':')
           c-aux[4] = ENTRY(4,ENTRY(4,c-source,'+'),':').

    CREATE tt-data.
    ASSIGN i-seq                = i-seq + 1
           tt-data.sequence     = i-seq
           tt-data.string-1     = c-aux[1]
           tt-data.string-2     = c-aux[2]  
           tt-data.string-3     = c-aux[3]  
           tt-data.string-4     = c-aux[4].

END.

FOR EACH tt-data 
    BY sequence:

    DISP tt-data WITH WIDTH 333 NO-ERROR.

END.
DEF TEMP-TABLE tt数据NO-UNDO
字段序列为INT
字段字符串-1为字符格式“x(20)”的字符
字段字符串-2为字符格式“x(20)”的字符
字段字符串-3为字符格式“x(20)”的字符
字段字符串-4为字符格式“x(20)”的字符
索引ch unique是主唯一的
序列
定义变量i-seq为INT NO-UNDO INIT 0。
DEF VAR c-aux作为字符NO-UNDO区段4。
DEF VAR i计数为INT NO-UNDO。
DEF VAR c-source作为字符NO-UNDO。
DEF VAR c数据作为字符NO-UNDO
初始化“STS++56+202:::由于假期1'STS++56+202:::由于假期2'STS++56+202:::由于假期3'”。
i-count=1到NUM-ENTRIES(c-data,“”):
分配c-source=条目(i-count,c-data,“”)。
如果微调(c源)=''或
NUM-ENTRIES(c源代码“+”)4然后
下一个
分配c-aux[1]=条目(1,c源“+”)
c-aux[2]=条目(3,c源“+”)
c-aux[3]=条目(1,条目(4,c源“+”),“:”)
c-aux[4]=条目(4,条目(4,c-source,“+”),“:”)。
创建tt数据。
分配i-seq=i-seq+1
tt-data.sequence=i-seq
tt-data.string-1=c-aux[1]
tt-data.string-2=c-aux[2]
tt-data.string-3=c-aux[3]
tt-data.string-4=c-aux[4]。
结束。
对于每个tt数据
按顺序:
显示宽度为333的tt数据无错误。
结束。

此解决方案可能不是最好的,但假设您所展示的模式,我认为这可以帮助您

DEF TEMP-TABLE tt-data NO-UNDO
    FIELD sequence      AS INT
    FIELD string-1      AS CHAR FORMAT 'x(20)'
    FIELD string-2      AS CHAR FORMAT 'x(20)'
    FIELD string-3      AS CHAR FORMAT 'x(20)'
    FIELD string-4      AS CHAR FORMAT 'x(20)'
    INDEX ch-unique IS PRIMARY UNIQUE
        sequence.

DEF VAR i-seq           AS INT  NO-UNDO INIT 0.
DEF VAR c-aux           AS CHAR NO-UNDO EXTENT 4.
DEF VAR i-count         AS INT  NO-UNDO.
DEF VAR c-source        AS CHAR NO-UNDO.
DEF VAR c-data          AS CHAR NO-UNDO
    INIT "STS++56+202:::DUE TO HOLIDAY1'STS++56+202:::DUE TO HOLIDAY2'STS++56+202:::DUE TO HOLIDAY3'".

DO i-count = 1 TO NUM-ENTRIES(c-data,"'"):

    ASSIGN c-source = ENTRY(i-count,c-data,"'").

    IF TRIM(c-source)               = '' OR
       NUM-ENTRIES(c-source,'+')   <> 4  THEN
        NEXT.

    ASSIGN c-aux[1] = ENTRY(1,c-source,'+')
           c-aux[2] = ENTRY(3,c-source,'+')
           c-aux[3] = ENTRY(1,ENTRY(4,c-source,'+'),':')
           c-aux[4] = ENTRY(4,ENTRY(4,c-source,'+'),':').

    CREATE tt-data.
    ASSIGN i-seq                = i-seq + 1
           tt-data.sequence     = i-seq
           tt-data.string-1     = c-aux[1]
           tt-data.string-2     = c-aux[2]  
           tt-data.string-3     = c-aux[3]  
           tt-data.string-4     = c-aux[4].

END.

FOR EACH tt-data 
    BY sequence:

    DISP tt-data WITH WIDTH 333 NO-ERROR.

END.
DEF TEMP-TABLE tt数据NO-UNDO
字段序列为INT
字段字符串-1为字符格式“x(20)”的字符
字段字符串-2为字符格式“x(20)”的字符
字段字符串-3为字符格式“x(20)”的字符
字段字符串-4为字符格式“x(20)”的字符
索引ch unique是主唯一的
序列
定义变量i-seq为INT NO-UNDO INIT 0。
DEF VAR c-aux作为字符NO-UNDO区段4。
DEF VAR i计数为INT NO-UNDO。
DEF VAR c-source作为字符NO-UNDO。
DEF VAR c数据作为字符NO-UNDO
初始“STS++56+202:::由于假期1的STS++56+202:::