Comment les doublons peuvent-ils être supprimés d'un fichier en utilisant COBOL?
le fichier d'entrée a des enregistrements comme: 8712351,8712353,8712353,8712353,8712356,8712352,8712355 8712352,8712355
en utilisant COBOL je dois supprimer les doublons du fichier ci-dessus et écrire dans un fichier de sortie. Je écrit la logique simple pour lire des enregistrements et écrire dans un fichier de sortie.
Où dois-je mettre la logique de supprimer les doublons (disons ,8712353,8712352) du fichier ci-dessus. Voici le programme de la logique:
IDENTIFICATION DIVISION.
PROGRAM-ID.RemoveDup.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUTFILEDUP ASSIGN TO 'C:CobolINPUTFILEDUP.txt'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUTFILEDUP ASSIGN TO 'C:CobolOUTFILEDUP.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.
je trié le fichier D'entrée dans l'ordre croissant comme: 8712351,8712353,8712353,8753,8712353,8712356,8712352,8712352,8712355,8712355 Et cela a fonctionné, voici le code modifié:
mais supposons que mon fichier ne soit pas dans l'ordre ascendant ou décroissant où je dois écrire la logique de tri avant de supprimer dups. s'il Vous Plaît pouvez-vous mettre à jour mon code ci-dessous pour cela comme j'ai essayé mais pas réussi à le faire si la structure de comme:
8712351,8712353,8712353,8712354,8712356,8712352,8712352,8712352,8712555,8712352,8712355
IDENTIFICATION DIVISION.
PROGRAM-ID.RemoveDup2.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUTFILEDUP ASSIGN TO 'C:CobolINPUTFILEDUP.txt'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUTFILEDUP ASSIGN TO 'C:CobolOUTFILEDUP.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 réponses
finalement ça a marché. Voici le code
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.
Quand Organization
Sequential
, le dossier supprimé est le dernier enregistrement lu. Delete
l'instruction n'est valide que lorsque la dernière opération contre le fichier est réussie Read
déclaration. Si pas, le Delete
retourne un File Status
valeur de 43. Parce que un Delete
ne peut pas retourner File Status
valeurs commençant par un 2 Quand le fichier est Open
Sequential
Accès, de codage Invalid Key
sur un Delete
n'est pas autorisé.
Quand Dynamic
ou Random
l'accès est sélectionné pour le fichier, Delete
déclaration, comme l' Rewrite
, devient un peu moins restrictive. Il n'est pas nécessaire que bene ait lu l'enregistrement en cours de suppression. Il suffit de remplir le primaire Key
information dans la description du document pour le fle et émettre le Delete
déclaration. Si l'enregistrement n'existe pas, un File Status
23 est renvoyée et un Invalid Key
la condition existe.
à Partir de la page 274 de
Sams Teach Yourself COBOL in 24 Hours
page 274 (que je viens de dépoussiérer de ma bibliothèque). Si dans votre cas, vous devrez probablement configurer vos enregistrements à trier par INPUTFILEID
, faites un enregistrement en passant par les occurences d'un INPUTFILEID
passé sa première occurrence, et Delete
en conséquence (après l'avoir écrit à votre fichier de sortie).
si vous voulez trier le fichier avec un tri externe avant de le lire dans le programme cobol, vous pouvez supprimer les doublons avec le mot-clé SORT égal. Si vous triez le fichier avant le programme cobol et que vous ne supprimez pas les doublons, alors une simple instruction IF et un champ save vous permettront de supprimer les dups.
configurer un champ INPUTFILEID-save. Juste après la lecture.... Si inputfileid égale inputfileid-save read if not write... après le mouvement d'écriture inputfileid à inputfileid-save. Vous devrez casser la performance actuelle pour le faire.
Si vous ne comprenez pas entièrement ce que je dis et vous aidera à changer le code dites le moi
trier est la norme pour ces travaux os-close à suivre le principe sec, engrenages-t pour séparateur et-u Pour uniques. C'est C.!--3-->