如何删除顺序文件中的最后3条记录

时间:2011-02-07 18:06:54

标签: cobol

我的顺序文件中有n条记录,我必须使用COBOL程序删除顺序文件中的最后3条记录。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

是的,有一些技巧,但它们都没有通过不同的Cobol编译器和不同的操作系统版本。

如果您想以纯粹的,完全可移植的Cobol风格进行操作,请读取整个文件,一次缓冲三条记录,并在每条记录从缓冲区中删除时写入。当你点击文件末尾时,只需停止写入缓冲的记录,你将删除最后三个。

一些Pseudo-Cobol可能看起来像这样:

   Perform Fill-Buffer
   Perform until End-Of-File
      Perform Write-Buffer
      Perform Fill-Buffer
   End-Perform
   .

Write-Buffer.
   Write OUTPUT-FILE 
    from The-Buffer (TOP-OF-BUFFER)
   End-Write
   .

Fill-Buffer.
* Do reads to fill a 3 position ring buffer
* and adjust TOP-OF-BUFFER to the current record...   
   .

实际上,使用实用程序(如SORT)可以做得更好。但你可以用Cobol做到这一点。

答案 1 :(得分:0)

您知道您正在阅读的文件的数量,还是每次运行该程序时都会更改?

在不知道计数的情况下,没有简单的方法可以做到这一点。否则,您必须读取文件两次,一次用于计数,第二次用于存储新的更新记录。

如果空间和内存不是主要问题,请将整个文件放在工作存储中,然后从表中写回文件,减去最后3条记录。这导致文件中有一次没有额外的读取或写入。

答案 2 :(得分:0)

您可以使用dfssort实用程序以非常有效的方式更快地完成此操作,如下所示。这只是一个例子。请相应更改记录长度和其他参数。此外,您需要在此手动计算记录数。

//SORTT001 EXEC PGM=SORT                                                00100003
//SYSOUT   DD  SYSOUT=*                                                 00110003
//SORTIN   DD  DSN=INPUT.FILE,DISP=SHR                                  00160003
//SORTOUT  DD  DSN=OUTPUT.FILE,                                         00170003
//             SPACE=(2790,(5376,1075),RLSE),                           00180003
//             UNIT=SYSSF,                                              00190003
//             DCB=(RECFM=FB,LRECL=0080,BLKSIZE=0),                     00200003
//             DISP=(NEW,CATLG,DELETE)                                  00210003
//SYSIN    DD  *                                                        00220003
 SORT FIELDS=COPY,STOPAFT=100                                           00230003
/*       

只计算记录数并更新" STOPAFT = 100"如果你想要一个通用的解决方案,请告诉我。