我正在读取一个可变长度的输入文件,并希望创建一个不会逐字符移动的输出缓冲区(索引表)。
例如:我的第一个输入记录是79个字符,然后我可以将其移动到表格的组级别。我的第二个输入记录是101个字符 - 如何将这101个字符放在我的表格中,从位置80开始,长度为101?并且下一个输入记录从位置180开始......等等。我们目前正在逐行执行变量,但与块移动到起始地址相比,这是非常耗费CPU的。
我们每天做数百万次,解决方案非常有用。
答案 0 :(得分:2)
使用参考修改与记录的长度。考虑:
01 Record
05 Rec-LL Pic S9(4) Binary.
05 Rec-Data Pic X(32767).
01 Tgt-Area Pic X(10000000).
01 Curr-Ptr Pic S9(8) Binary.
读完记录后,您可以根据长度进行移动:
Move 1 to Curr-Ptr
Perform Get-Next-Record
Perform until no-more-data
Move Rec-Data (1:Rec-LL) to Tgt-Area (curr-ptr:rec-LL)
Compute Curr-Ptr = Curr-Ptr + Rec-LL
Perform Get-Next-Record
End-Perform
答案 1 :(得分:0)
或者老式的(我们在这里谈论COBOL这么老式=侏罗纪)的方式: -
01 Record.
05 REC-LL PIC S9(4) Binary.
05 REC-DATA.
10 REC-BYTES PIC X OCCURS 32767 times depending on REC-LL.
01 TARGET-AREA.
05 TARGET-HEADER PIC X(79).
05 TARGET-REC PIC X(101) OCCURS 50 TIMES.
01 TGT-INDEX PIC S9(8) BINARY VALUE 1.
* Length calculation happens by magic!
Perform Read-Record.
move REC-DATA TO TARGET-HEADER.
perform until no-more-data
Perform Read-Record
move REC-DATA to TARGET-RED(TGT-INDEX)
add +1 to TGT-INDEX
end-perform
或者如果记录确实在1到101个字节之间变化:
01 Record.
05 REC-LL PIC S9(4) Binary.
05 REC-DATA.
10 REC-BYTES PIC X OCCURS 32767 times depending on REC-LL.
01 TARGET-AREA.
05 TGT-LL PIC s9(8) BINARY.
05 TGT-REC.
10 TGX-BYTE OCCURS 3175 depending on TGT-LL.
05 TGT-EXTRA PIC X(101).
Perform Read-Record.
Move +0 to tgt-LL.
perform until no-more-data
MOVE REC-DATE to TGT-EXTRA
ADD REC-LL TO TGT-LL
Perform Read-Record
add +1 to TGT-INDEX
end-perform
答案 2 :(得分:0)
查看STRING INTO动词,特别是 WITH POINTER 子句。当像这样串起东西时,不要忘记ON OVERFLOW命令。
有关详细信息,请获取Gary Cutler的OpenCOBOL程序员指南的副本。
http://opencobol.add1tocobol.com/OpenCOBOL%20Programmers%20Guide.pdf
这是一本世界级的COBOL手册,它是一个开放的免费文档(GNU FDL)。