Ibm midrange iSeries COBOL-前/后计数
我有一个字段,里面有一些标签 我必须提取这些标记之间的值。 字符串示例:Ibm midrange iSeries COBOL-前/后计数,ibm-midrange,cobol,Ibm Midrange,Cobol,我有一个字段,里面有一些标签 我必须提取这些标记之间的值。 字符串示例: MSG="HERE IS THE TAGS /33=10000/34=36363/35=22222" 因此,我必须提取“/33=”和“/34=”之间的值。。。在这种情况下是10000 在我的cobol源代码中,我可以使用第一个,因为它计算“/33=”之前的所有字符: 但我不明白为什么第二天不工作,我必须给我多少份工作: INSPECT MSG TALLYING COUNT2 FOR CHARACTER
MSG="HERE IS THE TAGS /33=10000/34=36363/35=22222"
因此,我必须提取“/33=”和“/34=”之间的值。。。在这种情况下是10000
在我的cobol源代码中,我可以使用第一个,因为它计算“/33=”之前的所有字符:
但我不明白为什么第二天不工作,我必须给我多少份工作:
INSPECT MSG TALLYING COUNT2 FOR CHARACTERS AFTER "/33=" BEFORE "/"
计数2给我0
有人能帮我吗?
提前谢谢
DenisINSPECT语句不起作用,因为“BEFORE'/'”正在定位第一个斜杠,即“/33=”中用于计数0的斜杠。您可以尝试使用PERFORM UNTIL,其中可以使用INSPECT Talling来了解斜杠的位置。这就像在字符串中请求索引一样 所有这些都是假设您需要可变长度的,否则使用固定结构是最好的 如果我了解您需要什么,请看:
WORKING STORAGE.
01 TAB-OF-PARSED-INFO OCCURS 1 TO *[the max number of fields that you estimate]*
DEPENDING ON WS-I. ---> this can be omitted with fixed occurs
05 TAB-ITS-TAG PIC X(04).
05 TAB-WHAT-YOU-NEED PIC X(*[the max size between slashes]*).
01 WS-YOUR-STRING PIC X(*[the max total size]*).
01 WS-COUNTERS.
05 WS-I PIC 9(06).
05 WS-COUNTER PIC 9(06).
05 WS-INDEX PIC 9(06).
01 WS-WHAT-SEPARATES PIC X(01) VALUE '/'.
01 WS-TIME-FLAG PIC 9(01) VALUE 0.
88 WS-FIRST-TIME VALUE 0.
88 WS-AFTER-TIME VALUE 1.
...
PROCEDURE DIVISION.
INITIALIZE WS-COUNTERS
INSPECT WS-YOUR-STRING
TALLYING WS-COUNTER FOR ALL WS-WHAT-SEPARATES
PERFORM 1234-PARSING-SLASHES
THRU 1234-PARSING-SLASHES-EXIT
UNTIL WS-I >= WS-COUNTER
ADD 1 TO WS-I
MOVE WS-YOUR-STRING TO TAB-WHAT-YOU-NEED(WS-I)
.
1234-PARSING-SLASHES.
MOVE ZEROES TO WS-INDEX
INSPECT WS-YOUR-STRING
TALLYING WS-INDEX FOR ALL CHARACTERS BEFORE WS-WHAT-SEPARATES
ADD 1 TO WS-I
IF WS-FIRST-TIME THEN
MOVE 'N/A' TO TAB-TAG(WS-I)
MOVE WS-YOUR-STRING(1:WS-INDEX) TO TAB-WHAT-YOU-NEED(WS-I)
SET WS-AFTER-TIME TO TRUE
ELSE
MOVE WS-YOUR-STRING(1:3) TO TAB-TAG(WS-I)
MOVE WS-YOUR-STRING(4:WS-INDEX) TO TAB-WHAT-YOU-NEED(WS-I)
END-IF
* We adding 2 because WS-INDEX is the last non slash character.
* WS-INDEX + 1 is the slash
ADD 2 TO WS-INDEX
COMPUTE WS-LEN = LENGTH OF WS-YOUR-STRING
MOVE WS-YOUR-STRING(WS-INDEX:WS-LEN)
TO WS-YOUR-STRING
.
1234-PARSING-SLASHES-EXIT.
EXIT.
输入:
WS-YOUR-STRING="HERE IS THE TAGS /33=10000/34=36363/35=22222"
WS-I = 01
TAB-TAG(01) = N/A
TAB-WHAT-YOU-NEED(01) = HERE IS THE TAG
WS-I = 02
WS-YOUR-STRING = 33=10000/34=36363/35=22222
TAB-TAG(02) = 33=
TAB-WHAT-YOU-NEED(02) = 10000
WS-I = 03
WS-YOUR-STRING = 34=36363/35=22222
TAB-TAG(03) = 34=
TAB-WHAT-YOU-NEED(03) = 36363
WS-I = 04
WS-YOUR-STRING = 35=22222
TAB-TAG(04) = 35=
TAB-WHAT-YOU-NEED(04) = 22222
输出:
WS-YOUR-STRING="HERE IS THE TAGS /33=10000/34=36363/35=22222"
WS-I = 01
TAB-TAG(01) = N/A
TAB-WHAT-YOU-NEED(01) = HERE IS THE TAG
WS-I = 02
WS-YOUR-STRING = 33=10000/34=36363/35=22222
TAB-TAG(02) = 33=
TAB-WHAT-YOU-NEED(02) = 10000
WS-I = 03
WS-YOUR-STRING = 34=36363/35=22222
TAB-TAG(03) = 34=
TAB-WHAT-YOU-NEED(03) = 36363
WS-I = 04
WS-YOUR-STRING = 35=22222
TAB-TAG(04) = 35=
TAB-WHAT-YOU-NEED(04) = 22222
如果您发现任何错误,请告诉我。您是否尝试检查了“/33=”之前“/34”之后字符的MSG计数2?您可能会发现使用
解除MSG分隔符“/”更容易…
是的,我在一个小时内尝试了许多变体。。。为了找到标签后面的下一个“/”,我使用了一个经典的PERFORM,直到。。。5分钟我已经完成了。。。非常感谢大家:-)@Denis如果你有一个有效的解决方案,请回答你自己的问题并接受它(->Q+a风格);如果你知道你最初的方法不起作用的原因,最好把它包括在答案中。不。。。我还不明白为什么它不起作用。所以我的答案不可能是这个问题的答案。