解开一个在 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 调整定义,但我认为上面的代码传达了这个想法。
我有一个字段将具有变量值或没有值。该字段是
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 调整定义,但我认为上面的代码传达了这个想法。