web-dev-qa-db-ja.com

COBOLを使用してファイルから重複を削除するにはどうすればよいですか?

入力ファイルには、8712351,8712353,8712353,8712354,8712356,8712352,87123558712352,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.

入力ファイルを昇順で並べ替えました: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.
30
Sanjana

ついにうまくいきました。これがコードです

   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.
6
Sanjana

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

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

の274ページから

Samsは24時間でCOBOLを教えます

274ページ(本棚からほこりを払ったところです)。したがって、あなたの場合は、おそらくINPUTFILEIDでソートされるようにレコードを設定し、最初の発生を過ぎた特定のINPUTFILEIDの発生を通過するときにレコードを作成し、それに応じてDeleteを作成します(出力ファイルに書き込んだ後)。 。

2
davek

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

INPUTFILEID-saveフィールドを設定します。読み取り直後.... IF inputfileid equal inputfileid-書き込みを行わない場合は、読み取りを再度保存します...書き込み後、inputfileidをinputfileid-saveに移動します。これを行うには、現在のパフォーマンスを分割する必要があります。

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

1
Vince Manso

sort は、これらのos-closeジョブが従う標準ですDRY原則、ギアはセパレーターの場合は-t、一意の場合は-uです。Cです。

1