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.
30
demandé sur ChrisF 2009-11-18 21:55:04

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.
6
répondu Sanjana 2009-11-18 20:44:04

Quand OrganizationSequential, 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 OpenSequential 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).

2
répondu davek 2009-11-18 19:50:18

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

1
répondu Vince Manso 2009-11-18 19:32:05

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-->

1
répondu Niklas Rosencrantz 2009-11-19 14:12:58