Arrays COBOL解列为数组
我正试图将用“;”分隔的输入行解列为一个数组。但在第一个“;”之后显示每个单词时,我遇到了麻烦 基本上,输入:Hello;堆栈溢出Arrays COBOL解列为数组,arrays,string,input,record,cobol,Arrays,String,Input,Record,Cobol,我正试图将用“;”分隔的输入行解列为一个数组。但在第一个“;”之后显示每个单词时,我遇到了麻烦 基本上,输入:Hello;堆栈溢出 输出:值:2(因为有2个分号) 我的记录表的第1行:您好 我的记录表的第2行:堆栈 我的记录表的第3行:溢出 到目前为止,我的代码是: *------------------------------------------------------------- LINKAGE SECTION.
输出:值: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.
*-------------------------------------------------------------
联动部分。
01 X输入线PIC X(2000)。
01 X-SEP-CHAR图片X(1)。
01 X-RET-TABLE。
02 CMAX PIC 9(5)COMP-3。
02根据CMAX,ENTRY-REC发生0到9999次
由CIDX索引。
04进入记录2。
07线值PIC X(100)。
使用X输入线进行程序划分
X-SEP-CHAR
X-RET-TABLE。
主要部分。
MN-00。
初始化WERT。
检查X输入线理货机的所有部件
X-SEP-CHAR。
将X输入行移动到VAL。
在WERT中添加1。
执行WERT次
将WERT移动到X-RET-TABLE(WERT)的行值
取消对VAL的排序,以“;”分隔
进入斯特瓦尔
端部非拉伸
如果X-RET-TABLE的CMAX<9999
将1添加到X-RET-TABLE的CMAX中
将STRVAL移动到ENTRY-REC(X-RET-TABLE的CMAX)
端到端IF
结束表演。
使用下面的代码,我只能在我的示例中显示“Hello”,程序会在3行中显示它3次。解除拉伸实际上不起作用。若您知道要解列到的内容的字段名,则解列将起作用。基本上,代码中发生的事情是运行3次解列,因为“hello”是解列中的第一件事,所以它被解列3次。如果要在阵列中执行可扩展的操作,则需要编写如下循环代码:
01 WS-UNSTRING-FIELDS.
05 WS-INPUT PIC X(1000).
05 WS-SUB PIC 9(4) COMP.
05 WS-START PIC 9(4) COMP VALUE 1.
05 WS-INDEX PIC 9(4) COMP VALUE 0.
05 WS-ARRAY OCCURS 0 TO 9999 DEPENDING ON WS-INDEX.
PERFORM VARYING WS-SUB
FROM 1 BY 1
UNTIL WS-SUB > FUNCTION LENGTH(WS-INPUT)
IF WS-INPUT(WS-SUB:1) = ";"
ADD 1 TO WS-INDEX
MOVE WS-INPUT(WS-START:WS-SUB - 1)
TO WS-ARRAY(WS-INDEX)
COMPUTE
WS-START = WS-SUB + 1
END-COMPUTE
END-IF
END-PERFORM
我还没有真正的时间来测试它,并确保它100%工作,但你需要一些类似的东西。无论如何,我都不会在这里使用非拉伸
当您确切地知道有多少字段进入时,解除拉伸非常有效。例如,假设您有一个与MQ series交互的通用程序。作为该程序的输入,您可以传递一个字符串,该字符串包含如下指令
QueueName/Action
然后,可以在此上下文中使用“取消拉伸”将其拆分为两个字段:
UNSTRING WS-INPUT DELIMITED BY "/"
INTO WS-Q-NAME
WS-ACTION
END-UNSTRING
假设这里的输入是:
THIS_IS_MY_QUEUE/DELETE
WS-Q-NAME会有这个“是我的”队列名称,WS-ACTION会删除您的原始代码
主要的问题是,您必须取消对给定变量的排序,并始终使用相同的起点
他说:“我们可以将与指针一起使用。用于STRING
该子句表示“存储下一个字符的位置”,用于UNSTRING
它表示“读取下一个字符的位置”
使用起始代码(添加调用者,实际使用给定的分隔符而不是固定的“;”和结果的显示),添加我们为起始点添加一个变量并使用它
UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
INTO STRVAL
END-UNSTRING
变成
UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
INTO STRVAL
WITH POINTER STARTING-POINT
END-UNSTRING
您还需要初始化一些部件,并可以直接使用表项(只要您确保计数器不会太大),为您提供(包括更多样本)。请提供,最好是可编译的…在循环中沿着将输入移动到REMIANDER
的路线使用解列
,然后使用将余数[…]解列为数组(IND)余数
执行直到余数='
,在我的源代码中WS-Sub或WS-Start到底是什么,我不能真正理解你的答案。@Brian WS-SUB只是一个递增的索引,这样你就可以一次检查字符串1个字符。WS-START只是跟踪每个分隔符后面第一个字符的位置。@piet.t这是另一个选项。就我个人而言,我更喜欢子字符串循环的想法。我发现更容易理解它到底是如何工作的。但是通过子字符串循环是一个非常复杂的问题option@piet.t@SaggingRufus使用解列时需要注意的一点是,它将字符从源字符串复制到目标字符串,直到满足终止数据移动的条件(在本例中,它是“;”)。因此,执行直到余数=”
使用将余数解压到数组(IND)中余数
将导致一个无休止的循环,因为数组(1)
将包含“Hello”,而余数
将包含“STACK”。当数组(1)的数据移动结束时,下一个目标字符串,余数成为接收区域&字符被复制,直到再次满足终止条件。首先,我不知道我们可以使用Cobol的编码基础来调用子程序。谢谢你的关注。伟大的答案。@SrinivasanJv最简单的方法是像我一样将所有内容合并到一个编译单元中(使用结束程序
)。当您在编码领域“共享”时,您总是共享可能由多个源组成的项目。要使多个源正常工作,您必须调整编译命令(最简单的方法是:更改为cobc-m*.cob
,并将run命令更改为cobcrunyourmain
)。