Arrays COBOL解列为数组

Arrays COBOL解列为数组,arrays,string,input,record,cobol,Arrays,String,Input,Record,Cobol,我正试图将用“;”分隔的输入行解列为一个数组。但在第一个“;”之后显示每个单词时,我遇到了麻烦 基本上,输入:Hello;堆栈溢出 输出:值:2(因为有2个分号) 我的记录表的第1行:您好 我的记录表的第2行:堆栈 我的记录表的第3行:溢出 到目前为止,我的代码是: *------------------------------------------------------------- LINKAGE SECTION.

我正试图将用“;”分隔的输入行解列为一个数组。但在第一个“;”之后显示每个单词时,我遇到了麻烦

基本上,输入:Hello;堆栈溢出


输出:值: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
)。