解开一个在 COBOL 中长度可变并由空格分隔的字段

Unstring a field which is of variable length in COBOL and separated by spaces

我有一个字段将具有变量值或没有值。该字段是

Ws-var = "12 11 87 98"

此处“12 11”需要是一对,“87 98”应该是另一对。该变量是动态的,可能包含更多组此类对。截至目前,我将 COBOL 代码编写为

Unstring ws-field delimited by space into
    Ws-temp1,ws-temp2,ws-temp3,ws-temp4. 

这些值将进一步用于成对处理。 当有 2 对值时,此代码将起作用。但是,如果将来条件发生变化需要更多这样的对,我想到了用数组实现,将每一对移动到输出字段,然后读取下一对。你能建议实现它的方法吗?

您可以使用字符串指针和 table 来实现这一点。使用 UNSTRING 时,字符串指针指定从 UNSTRING 开始的位置,并自动增加到下一个定界符之后的点(请注意,这也可能意味着:当目标字段“已满”时)。

       77  str-ptr                USAGE BINARY-LONG UNSIGNED.
       01  var-pair.
           05  var-a              PIC 9(04). *> or whatever your size is
           05  filler             PIC X.     *> to have exactly one space
           05  var-b              PIC 9(04). *> or whatever your size is
      *> for "standard" COBOL use 01 CONSTANT AS - or just hard-wire below
       78  var-pair-length        VALUE LENGTH OF var-pair.
       78  var-pair-max           VALUE 500. *> or whatever you need
       77  var-pair-cnt           USAGE BINARY-LONG UNSIGNED.
       01  var-pairs.
           05  pair               PIC X(var-pair-length) OCCURS  0 TO var-pair-max
                                                         DEPENDING ON var-pair-cnt.
    

           MOVE 1 TO str-ptr
           PERFORM var-pair-cnt FROM 1 BY 1
                   UNTIL var-pair-cnt > var-pair-max
              MOVE SPACES TO ws-temp1, ws-temp2
              UNSTRING ws-var DELIMITED BY ALL SPACE
                  INTO ws-temp1, ws-temp2
                  WITH POINTER str-ptr
              IF ws-temp1 = SPACES
                 EXIT PERFORM
              END-IF
              MOVE FUNCTION NUMVAL (ws-temp1) TO var-a
              MOVE FUNCTION NUMVAL (ws-temp2) TO var-b
              MOVE var-pair                   TO pair (var-pair-cnt)
           END-PERFORM

您可能需要添加一些验证 and/or 调整定义,但我认为上面的代码传达了这个想法。