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:::