入力ファイルには、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.
ついにうまくいきました。これがコードです
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.
Organization
がSequential
の場合、削除されたレコードが最後に読み取られたレコードです。 Delete
ステートメントは、ファイルに対する最後の操作が成功したRead
ステートメントである場合にのみ有効です。そうでない場合、Delete
はFile Status
値43を返します。ファイルがDelete
でOpen
アクセスの場合、Sequential
は2で始まるFile Status
値を返すことができないため、そのようなDelete
にInvalid Key
をコーディングします。許可されていません。
ファイルに対してDynamic
またはRandom
アクセスが選択されている場合、Delete
と同様に、Rewrite
ステートメントの制限が少し緩和されます。削除されるレコードは、以前に読み取られている必要はありません。ファイルのレコードの説明にプライマリKey
情報を入力し、Delete
ステートメントを発行するだけです。レコードが存在しない場合、23のFile Status
が返され、Invalid Key
条件が存在します。
の274ページから
274ページ(本棚からほこりを払ったところです)。したがって、あなたの場合は、おそらくINPUTFILEID
でソートされるようにレコードを設定し、最初の発生を過ぎた特定のINPUTFILEID
の発生を通過するときにレコードを作成し、それに応じてDelete
を作成します(出力ファイルに書き込んだ後)。 。
COBOLプログラムで読み取る前に外部ソートでファイルをソートする場合は、SORTキーワードEQUALSを使用して重複を削除できます。 COBOLプログラムの前にファイルをソートし、重複をドロップしない場合は、単純なIFステートメントと保存フィールドを使用して重複を削除できます。
INPUTFILEID-saveフィールドを設定します。読み取り直後.... IF inputfileid equal inputfileid-書き込みを行わない場合は、読み取りを再度保存します...書き込み後、inputfileidをinputfileid-saveに移動します。これを行うには、現在のパフォーマンスを分割する必要があります。
私が言っていることを完全に理解しておらず、コードを変更するのに役立つ場合は、私に知らせてください
sort は、これらのos-closeジョブが従う標準ですDRY原則、ギアはセパレーターの場合は-t、一意の場合は-uです。Cです。