30

入力ファイルには次のようなレコードがあります: 8712351,8712353,8712353,8712354,8712356,8712352,8712355

COBOLを使用して、上記のファイルから重複を削除し、出力ファイルに書き込む必要があります。レコードを読み取り、出力ファイルに書き込む単純なロジックを作成しました。

上記のファイルから重複 (たとえば、8712353、8712352) を削除するロジックをどこに置く必要がありますか?

プログラムロジックは次のとおりです。

   IDENTIFICATION DIVISION.
   PROGRAM-ID.RemoveDup.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT INPUTFILEDUP ASSIGN TO 'C:\Cobol\INPUTFILEDUP.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
   SELECT OUTFILEDUP ASSIGN TO 'C:\Cobol\OUTFILEDUP.txt'
               ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.

   FILE SECTION.
   FD INPUTFILEDUP.
   01 INPUTFILEDUPREC.
       88 EOFINPUTFILEDUP    VALUE HIGH-VALUES.
       02 INPUTFILEID        PIC 9(07).

   FD  OUTFILEDUP.
   01 OUTFILEDUPREC         PIC 9(07).

   WORKING-STORAGE SECTION.
   77 WS-VARIABLE            PIC 9(09).
   77 REC-NOT-MATCH          PIC 9(01).
   77 CUR-VARIABLE           PIC 9(09).

   PROCEDURE DIVISION.
   BEGIN.
   OPEN INPUT  INPUTFILEDUP
   OPEN OUTPUT OUTFILEDUP

   READ INPUTFILEDUP
       AT END SET EOFINPUTFILEDUP  TO TRUE
   END-READ
   PERFORM UNTIL (EOFINPUTFILEDUP)
                WRITE OUTFILEDUPREC  FROM  INPUTFILEID
               READ  INPUTFILEDUP
                     AT END SET EOFINPUTFILEDUP TO TRUE
                           PERFORM UNTIL (EOFINPUTFILEDUP)
  END-READ
  END-PERFORM
                   CLOSE   INPUTFILEDUP
                   CLOSE  OUTFILEDUP
  STOP RUN.

tnput ファイルを次のように昇順で並べ替えました。

8712351,8712353,8712353,8712354,8712356,8712352,8712355,8712352,8712355

そしてそれはうまくいきました、そして以下は修正されたコードです:

しかし、ファイルが昇順でも降順でもない場合、重複を削除する前にソート ロジックを記述する必要があるとします。これについて以下のコードを更新するにはどうすればよいですか? 私が試したように、入力ファイル構造が次のような場合、これを行うことに成功しませんでした:

8712351,8712353,8712353,8712354,8712356,8712352,8712355,8712352,8712355

   IDENTIFICATION DIVISION.
   PROGRAM-ID.RemoveDup2.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT INPUTFILEDUP ASSIGN TO 'C:\Cobol\INPUTFILEDUP.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
   SELECT OUTFILEDUP ASSIGN TO 'C:\Cobol\OUTFILEDUP.txt'
               ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.

   FILE SECTION.
   FD INPUTFILEDUP.
   01 INPUTFILEDUPREC.
       88 EOFINPUTFILEDUP    VALUE HIGH-VALUES.
       02 INPUTFILEID        PIC 9(07).

   FD  OUTFILEDUP.
   01 OUTFILEDUPREC         PIC 9(07).

   WORKING-STORAGE SECTION.
   77 WS-VARIABLE            PIC 9(09) VALUE ZERO.
   77 REC-NOT-MATCH          PIC 9(01).
   77 CUR-VARIABLE           PIC 9(7) VALUE ZERO.

   PROCEDURE DIVISION.
   BEGIN.
   OPEN INPUT  INPUTFILEDUP
   OPEN OUTPUT OUTFILEDUP

   READ INPUTFILEDUP
       AT END SET EOFINPUTFILEDUP  TO TRUE
   END-READ
   PERFORM UNTIL (EOFINPUTFILEDUP)
        IF INPUTFILEID NOT EQUAL TO  WS-VARIABLE
              MOVE  INPUTFILEID TO WS-VARIABLE
              WRITE OUTFILEDUPREC  FROM  INPUTFILEID
              READ  INPUTFILEDUP
                  AT END SET  EOFINPUTFILEDUP TO TRUE
              PERFORM UNTIL (EOFINPUTFILEDUP)
        ELSE
              DISPLAY "dUPLICATE FOUND"   INPUTFILEID

   READ INPUTFILEDUP
     AT END SET EOFINPUTFILEDUP  TO TRUE

   END-READ

       END-PERFORM

   CLOSE   INPUTFILEDUP
   CLOSE  OUTFILEDUP
   STOP RUN.
4

4 に答える 4

6

最後にそれは働いた。

コードは次のとおりです。

   IDENTIFICATION DIVISION.
   PROGRAM-ID.RemoveDup2.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT INPUTFILEDUP ASSIGN TO 'C:\Cobol\INPUTFILEDUP.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
   SELECT OUTFILEDUP ASSIGN TO 'C:\Cobol\OUTFILEDUP.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
   SELECT WorkFile ASSIGN TO "WORK.TMP".

   DATA DIVISION.

   FILE SECTION.
   FD INPUTFILEDUP.
   01 INPUTFILEDUPREC.
       88 EOFINPUTFILEDUP    VALUE HIGH-VALUES.
       02 INPUTFILEID        PIC 9(07).

   FD  OUTFILEDUP.
   01 OUTFILEDUPREC         PIC 9(07).

   SD WorkFile.
   01 WORKREC.
      02 WINPUTFILEID       PIC 9(07).

   WORKING-STORAGE SECTION.
   77 WS-VARIABLE            PIC 9(09) VALUE ZERO.
   77 REC-NOT-MATCH          PIC 9(01).
   77 CUR-VARIABLE           PIC 9(7) VALUE ZERO.

   PROCEDURE DIVISION.
   BEGIN.
       SORT WorkFile ON ASCENDING KEY WINPUTFILEID
       USING INPUTFILEDUP GIVING INPUTFILEDUP

   OPEN INPUT  INPUTFILEDUP
   OPEN OUTPUT OUTFILEDUP

       READ INPUTFILEDUP
               AT END SET EOFINPUTFILEDUP  TO TRUE
   END-READ
       PERFORM UNTIL (EOFINPUTFILEDUP)
           IF INPUTFILEID NOT EQUAL TO  WS-VARIABLE
                   MOVE  INPUTFILEID TO WS-VARIABLE
                   WRITE OUTFILEDUPREC  FROM  INPUTFILEID
                   READ  INPUTFILEDUP
                       AT END SET  EOFINPUTFILEDUP TO TRUE
       PERFORM UNTIL (EOFINPUTFILEDUP)
           ELSE
                   DISPLAY "DUPLICATE FOUND    "   INPUTFILEID

   READ INPUTFILEDUP
               AT END SET EOFINPUTFILEDUP  TO TRUE
   END-READ
   END-PERFORM

   CLOSE   INPUTFILEDUP
   CLOSE  OUTFILEDUP

   STOP RUN.
于 2009-11-18T20:44:04.090 に答える
2

Organizationがの場合Sequential、削除されたレコードは最後に読み取られたレコードです。このDeleteステートメントは、ファイルに対する最後の操作が成功したReadステートメントである場合にのみ有効です。ファイルがAccessの場合、a は 2 で始まる値をDelete返すことができないためFile Status、そのような aでのコーディングは許可されていません。DeleteFile StatusOpenSequentialInvalid KeyDelete

Dynamicファイルに対してまたはRandomアクセス が選択されている場合、 のDeleteようなステートメントのRewrite制限が少し緩和されます。削除されるレコードは、以前に読み取られたものである必要はありません。Keyファイルのレコード説明に主要な情報を入力し、Deleteステートメントを発行するだけです。レコードが存在しない場合は、File Status23 の a が返され、Invalid Key条件が存在します。

の 274 ページから

Sams が 24 時間で COBOL を独学

274ページ(本棚からほこりを落としたばかりです)。したがって、あなたのケースでは、レコードを でソートするように設定し、最初の出現を過ぎINPUTFILEIDた特定の出現を経て、それに応じて(出力ファイルに書き込んだ後)レコードを作成します。INPUTFILEIDDelete

于 2009-11-18T19:23:39.373 に答える
1

これらのOSクローズ ジョブでは、DRY原則に従うためにsortが標準です。Gears -t はセパレーター、-u は一意のものです。Cです。

于 2009-11-19T14:12:58.707 に答える
1

cobol プログラムでファイルを読み取る前に外部ソートでファイルをソートする場合は、SORT キーワード EQUALS を使用して重複を削除できます。cobol プログラムの前にファイルをソートし、重複を削除しない場合は、単純な IF ステートメントと保存フィールドで重複を削除できます。

INPUTFILEID 保存フィールドを設定します。read の直後.... IF inputfileid equal inputfileid-save read again if not write... write の後、inputfileid を inputfileid-save に移動します。これを行うには、現在のパフォーマンスを分割する必要があります。

私が言っていることを完全に理解しておらず、コードを変更するのに役立つ場合は、私に知らせてください

于 2009-11-18T19:32:05.473 に答える