3 arrays string cobol input record
我正在尝试将用“;”分隔的输入行解串到一个数组中。但是我无法在第一个“;”之后显示每个单词。
所以基本上,输入:你好;堆栈;溢出
输出:值:2(因为有 2 个分号)
我的记录表的第 1 行:你好
我的记录表的第 2 行:堆栈
我的记录表的第 3 行:溢出
到目前为止我的代码:
*-------------------------------------------------------------
LINKAGE SECTION.
01 X-INPUT-LINE PIC X(2000).
01 X-SEP-CHAR PIC X(1).
01 X-RET-TABLE.
02 CMAX PIC 9(5) COMP-3.
02 ENTRY-REC OCCURS 0 TO 9999 TIMES DEPENDING ON CMAX
INDEXED BY CIDX.
04 ENTRY-REC2.
07 LINEVALUE PIC X(100).
PROCEDURE DIVISION USING X-INPUT-LINE
X-SEP-CHAR
X-RET-TABLE.
MAIN SECTION.
MN-00.
INITIALIZE WERT.
INSPECT X-INPUT-LINE TALLYING WERT FOR ALL
X-SEP-CHAR.
MOVE X-INPUT-LINE TO VAL.
ADD 1 TO WERT.
PERFORM WERT TIMES
MOVE WERT TO LINEVALUE OF X-RET-TABLE (WERT)
UNSTRING VAL DELIMITED BY ";"
INTO STRVAL
END-UNSTRING
IF CMAX OF X-RET-TABLE < 9999
ADD 1 TO CMAX OF X-RET-TABLE
MOVE STRVAL TO ENTRY-REC(CMAX OF X-RET-TABLE)
END-IF
END-PERFORM.
Run Code Online (Sandbox Code Playgroud)
使用下面的代码,我只能在我的示例中显示“Hello”,并且程序在 3 个不同的行中显示了 3 次。
您的原始代码几乎可以工作。
主要问题是,您UNSTRING使用给定的变量并始终使用相同的起点。
他我们可以使用WITH POINTER。用在STRING子句上说“存储下一个字符的位置”,用在UNSTRING它上面说“下一个字符被读取的位置”。
使用起始代码(添加调用者,实际上使用给定的分隔符而不是固定的“;”和DISPLAY结果的 a),在这里添加我们为起始点添加一个变量并使用它。
UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
INTO STRVAL
END-UNSTRING
Run Code Online (Sandbox Code Playgroud)
变成
UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
INTO STRVAL
WITH POINTER STARTING-POINT
END-UNSTRING
Run Code Online (Sandbox Code Playgroud)
您还需要初始化某些部分并可以直接使用表项(只要您确保计数器不会变得太大),为您提供结果(包括更多样本)。