2

我在课堂上的挑战是编写一个读取 3 个输入 txt 文件并生成 1 个 txt 输出文件的程序。所有输入文件必须优先采用行顺序模式,并且没有人索引(这是打破我们思想的规则)。

文件 1 具有字段 ID-USER(由它排序)和其他字段;文件2有字段ID-USER(由它排序),ID-JOB等;文件 3 具有字段 ID-JOB(由它排序)和其他字段。输出文件将连接来自 3 个文件的数据。

带有 2 个文件的 cobol 中的平衡线是一项艰苦的工作,但我可以做到。但是使用3个输入文件,当ID-USER在文件1和2中对应时,我必须提前读取文件3以在文件2和3上记录对应的ID-JOB,而我的平衡线不起作用,因为我没有'不知道是否可以在文件 3 上“重新启动”读取。

恢复:如何在特定输入文件(文件 3)上使用顺序模式重新开始读取?或在同一 cobol 程序上反向搜索方向。

4

3 回答 3

3

两种可能的过程

  1. 2个排序合并程序一个在Job-Id上,一个在ID-USER上
  2. 将 File-3 加载到索引文件(大型机上的 VSAM 文件)或数据库中。Index-File/Db 的键是 Job-Id。然后你可以做一个索引读取

两个程序

确切的顺序将取决于文件输出顺序。你可以

  1. 对Job-id上的 File-2 和 File-3 进行排序,并使用来自这两个文件的所需数据创建一个输出 file-4
  2. 在ID-USERmerge2 个文件上对文件 1 和文件 4 进行排序

或者你可以

  1. Sort MergeID-USER上的 file-1 和 file-2 并创建 file-4
  2. Sort MergeJob-id上的 file-1 和 file-4

索引文件解决方案

  1. 在程序启动之前或作为初始化的一部分,将 file-3 加载到索引文件(比如 file-3i)(如果很小,可以使用数组)。
  2. Sort MergeID-USER上的 file-1 和 file-2并在 File-3i 上进行索引查找
于 2018-12-17T21:12:50.523 回答
2

如何在特定输入文件(文件 3)上使用顺序模式重新开始读取?

要从头开始读取文件,请使用CLOSEthen OPEN INPUT

或在同一 cobol 程序上反向搜索方向。

没有 COBOL 语句可以反向读取行顺序文件。可以通过调用 C 程序来反向扫描文件 3,将其视为“二进制”文件。

我不清楚平衡线这个术语是否应该适用于这种情况。这是因为第三个文件与第二个文件不共享相同的序列。

Bruce Martin 为完成这项任务提供了一些建议。

这是一个“挑战[in] class”,可能是您无法使用这些建议的情况。

但是,如果您想按照您的概述继续,那么您需要注意,如果您在 File 2 的 ID-JOB 小于 File 3 的 ID-JOB时“重新启动” ,则需要将其视为潜在优势案子。具体来说,当File 2 的 ID-JOB 小于 File 3 的 ID-JOB 的最小值时,可能出现无限循环。

于 2018-12-19T21:00:36.400 回答
2

在提到在线资源时,我不太确定 Stack Overflow 和家庭作业,但 GnuCOBOL FAQ 有一个合并行顺序文件的示例。

希望这个小样本仍然让您有机会了解 MERGE,而不是剥夺您的任何机会。

https://open-cobol.sourceforge.io/faq/index.html#merge

请注意语法轨道图中的 ON ... KEY 短语如何在每个文件中重复,并带有多个文件。

避免链接腐烂;这是代码,但这应该始终可以通过在 MERGE 保留字条目中搜索“GnuCOBOL FAQ”来找到。

GCobol >>SOURCE FORMAT IS FIXED
      *> ***************************************************************
      *> Author:    Brian Tiffin
      *> Date:      20140610
      *> Purpose:   Demonstrate a merge pass
      *> Tectonics: cobc -x gnucobol-merge-sample.cob
      *> ***************************************************************
       identification division.
       program-id. gnucobol-merge-sample.

       environment division.
       configuration section.
       repository.
           function all intrinsic.

io     input-output section.
       file-control.
           select master-file
               assign to "master-sample.dat"
               organization is line sequential.

           select eastern-transaction-file
               assign to "east-transact-sample.dat"
               organization is line sequential.

           select western-transaction-file
               assign to "west-transact-sample.dat"
               organization is line sequential.
           select merged-transactions
               assign to "merged-transactions.dat"
               organization is line sequential.

           select working-merge
               assign to "merge.tmp".

data   data division.
       file section.
       fd master-file.
          01 master-record     pic x(64).

       fd eastern-transaction-file.
          01 transact-rec      pic x(64).

       fd western-transaction-file.
          01 transact-rec      pic x(64).

       fd merged-transactions.
          01 new-rec           pic x(64).

       sd working-merge.
          01 merge-rec.
             02 master-key     pic 9(8).
             02 filler         pic x.
             02 action         pic xxx.
             02 filler         PIC x(52).

code  *> ***************************************************************
      *> not much code
      *>     trick.  DEP, CHQ, BAL are action keywords.  They sort
      *>     descending as DEP, CHQ, BAL, so do all deposits, then
      *>     all withdrawals, then balance reports.
      *> ***************************************************************
       procedure division.
       merge working-merge
           on ascending key master-key
              descending key action
           using eastern-transaction-file,  western-transaction-file,
                 master-file
           giving merged-transactions
done   goback.
       end program gnucobol-merge-sample.

数据样本看起来像

11111111 CHQ 0001111.11 withdrawal from account one
33333333 DEP 0333333.33 third of a million in, pocket change
33333333 CHQ 0000333.33 payroll
33333333 CHQ 0000333.33 payroll
33333333 CHQ 0000333.33 payroll
55555555 DEP 0000555.55 deposit to new record five
55555555 CHQ 0000055.55 withdrawal from account five

东方

11111111 CHQ 0001111.11 withdrawal from account one
44444444 DEP 0000044.44 deposit to account four
66666666 BAL balance request for account six

西等。

GnuCOBOL 使得处理 LINE SEQUENTIAL 部分变得非常容易。

您的问题还有更多问题,这里没有提到,因为这个列表只是为了演示 MERGE with LINE SEQUENTIAL,而不是担心爆头。

于 2018-12-19T23:20:11.273 回答