【发布时间】:2014-02-04 07:12:27
【问题描述】:
我正在尝试使用 COBOL 程序读取顺序文件并将其写入其他文件(具有不同的结构)。
旧文件的结构包含一个字段,该字段包含一个表(一个数组)。
因此,我需要为此表编写一个循环,而不是使用“将旧字段移动到新字段”。 我该怎么做?
【问题讨论】:
-
您确实意识到我发布答案的意义?您是否注意到代码与您接受的答案不同?你有没有意识到你接受的答案忽略了每条记录的最后一个条目?
标签: cobol
我正在尝试使用 COBOL 程序读取顺序文件并将其写入其他文件(具有不同的结构)。
旧文件的结构包含一个字段,该字段包含一个表(一个数组)。
因此,我需要为此表编写一个循环,而不是使用“将旧字段移动到新字段”。 我该怎么做?
【问题讨论】:
标签: cobol
在您的输入记录中,您将拥有如下内容:
01 a-nicely-named-record.
05 nicely-named-data PIC ...
...
05 and-a-final-nice-name PIC ...
05 field-containing-the-count-of-actual-entries ... PIC ...
05 the-COBOL-table.
10 table-entry OCCURS n TIMES.
15 table-entry-data-nice-name PIC ...
...
15 table-entry-a-final-nice-name PIC ...
类似的东西。如果您可以显示自己的布局,那就更好了。 ... 的意思是“把你实际拥有的东西放在这里,因为我们不知道细节”。您的输入记录应为所有字段名称添加前缀,但可能没有。
你的输出记录:
01 a-nicely-named-record.
05 nicely-named-data PIC ...
...
05 and-a-final-nice-name PIC ...
05 field-containing-the-count-of-actual-entries ... PIC ...
05 the-COBOL-table.
10 table-entry OCCURS n TIMES.
15 table-entry-data-nice-name PIC ...
...
15 table-entry-a-final-nice-name PIC ...
同样,所有这些都应该有一个前缀。但可能没有。你说结构不同,但你没有表现出来,所以要“逻辑上”等价。
要访问表,您需要使用subscripting。下标编码在( 和) 内。下标可以使用文字值 (1)、(2) 等,或者使用索引(在 OCCURS 的数据定义上定义为 INDEXED BY)或使用数据名称作为下标。
01 the-subscript BINARY PIC 9(4).
BINARY PIC 9(4) 可以包含最大值 9999,如果您的表更大(不太可能,但并非不可能,对于文件上的表)然后将其设为 BINARY PIC 9(8)。
PERFORM
VARYING the-subscript
FROM 1
BY 1
UNTIL ( the-subscript
GREATER THAN field-containing-the-count-of-actual-entries )
MOVE input-field.... ( the-subscript ) to output-filed... ( the-subscript )
...
MOVE input-field.... ( the-subscript ) to output-filed... ( the-subscript )
END-PERFORM
使用索引与上面的相同,除了引用索引名称而不是下标。
如果表中的条目数量很少(相对术语),您可以只使用文字:
MOVE input-field.... ( 1 ) TO output-filed... ( 1 )
...
MOVE input-field.... ( 1 ) TO output-filed... ( 1 )
MOVE input-field.... ( n ) TO output-filed... ( n )
...
MOVE input-field.... ( n ) TO output-filed... ( n )
如果两个文件的表格格式相同,并且您确定输入表格中的数据完全符合 PICture 子句,则可以使用一条 MOVE 语句完成。
MOVE input-table TO output-table
如果所有记录都有固定数量的条目,您可以使用
initial value for subscript/index
PERFORM n TIMES
MOVEs (as above)
increment subscript/index
END-PERFORM
如果您有问题,请使用输入和输出记录、编译器名称和您正在使用的操作系统更新您的问题。
【讨论】:
PERFORM VARYING MY-SUBSCRIPT FROM +1 BY +1
UNTIL MY-SUBSCRIPT NOT LESS THAN NUMBER-IN-FILE-RECORD
MOVE IN-FILE-FIELD1(MY-SUBSCRIPT) TO OUT-FILE-FIELD1
.....
MOVE IN-FILE-FIELD99(MY-SUBSCRIPT) TO OUT-FILE-FIELD99
WRITE OUT-FILE-RECORD
END-PERFORM.
【讨论】:
UNTIL MY-SUBSCRIPT NOT LESS THAN NUMBER-IN-FILE-RECORD 这个条件会删除最后一个表条目。 UNTIL 条件在进入循环体之前被评估,你似乎假设 TEST AFTER。正确的条件是:UNTIL MY-SUBSCRIPT > NUMBER-IN-FILE-RECORD