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

Cobol 如何删除顺序文件中的最后3条记录,cobol,Cobol,我的顺序文件中有n条记录,我必须使用COBOL程序删除顺序文件中的最后3条记录。我怎样才能做到这一点呢?是的,有一些技巧,但没有一个可以通过不同的Cobol编译器和不同的操作系统版本进行移植 如果您想用纯的、完全可移植的Cobol风格来做这件事,那么可以一次读取缓冲三条记录的整个文件,并在每条记录从缓冲区脱落时写入。当到达文件末尾时,只要停止写入缓冲记录,就会删除最后三条 某些伪Cobol可能如下所示: Perform Fill-Buffer Perform until End-Of

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

是的,有一些技巧,但没有一个可以通过不同的Cobol编译器和不同的操作系统版本进行移植

如果您想用纯的、完全可移植的Cobol风格来做这件事,那么可以一次读取缓冲三条记录的整个文件,并在每条记录从缓冲区脱落时写入。当到达文件末尾时,只要停止写入缓冲记录,就会删除最后三条

某些伪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来执行此操作。

您知道正在读取的文件的计数吗,还是每次运行程序时都会更改

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


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

使用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”。如果您需要通用解决方案,请告诉我。

在选择中。。。组织机构是xxxx?有一些技巧,但是编译器和操作系统是相关的。请同时指定两个选项。+1表示这不值得编写一个实用程序!为什么我们需要一个通用的解决方案?每次我必须从一个文件中删除三条记录时,我的文件中正好有103条记录,所以我相信其他所有人的记录都是一样的。不要指定LRECL和RECFM。SORT会这样做的。如果在JCL中指定它,有两个地方需要注意。至于效率和速度,你是从哪里得到计数的?第二次读取文件?从通用解决方案中,我的意思是如果文件记录不断变化。或者只需要一次。因此,可以手动统计记录数,使用stopafter可以忽略最后三条记录。我只是举了个例子。是的,你说得对,我说得太具体了。用手或用眼睛数数也不是很有效。浏览/查看和执行m-PF8也是如此。无论如何,这是一个相当愚蠢的要求。然而,如果您查看ICETOOL,您应该会发现一些足够通用的东西。这是一个线索。谢谢你的宝贵建议。从现在起,我会记住你的建议。