处理带有子句的文件

时间:2014-02-04 07:12:27

标签: cobol

我正在尝试使用COBOL程序读取顺序文件并将其写入其他文件(具有不同的结构)。

旧文件的结构包含一个包含表(数组)的字段。

因此,我不需要使用“move field-old to field-new”,而是需要为此表编写一个循环。 我该怎么做?

2 个答案:

答案 0 :(得分:3)

在输入记录中,您将拥有以下内容:

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)等,也可以使用索引(在INDEXED BY的数据定义上定义为OCCURS)或使用数据名作为下标

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

如果您有问题需要进一步说明,请使用输入和输出记录,编译器名称以及您正在使用的操作系统更新您的问题。

答案 1 :(得分:1)

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.