Как удалить дубликаты из файла с помощью COBOL? - PullRequest
30 голосов
/ 18 ноября 2009

Входной файл имеет записи как: 8712351,8712353,8712353,8712354,8712356,8712352,8712355 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.

Я отсортировал входной файл в порядке возрастания как: 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 ]

6 голосов
/ 18 ноября 2009

Наконец-то это сработало. Вот код

   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.
2 голосов
/ 18 ноября 2009

Если Organization равно Sequential, удаленная запись является последней прочитанной записью. Оператор Delete действителен только тогда, когда последняя операция с файлом является успешной операцией Read. Если нет, то Delete возвращает значение File Status, равное 43. Поскольку Delete не может возвращать значения File Status, начинающиеся с 2, когда файл Open с доступом Sequential, кодирование Invalid Key на таком Delete не допускается.

Когда для файла выбран доступ Dynamic или Random, статус Delete, как и Rewrite, становится немного менее строгим. Удаляемая запись не обязательно должна быть прочитана ранее. Просто заполните первичную Key информацию в описании записи для fle и введите оператор Delete. Если запись не существует, возвращается File Status из 23 и существует условие Invalid Key.

со страницы 274

Самс научит себя коболу за 24 часа

стр. 274 (которую я только что отряхнул со своей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID, сделаете запись по мере прохождения вхождений данного INPUTFILEID после его первого вхождения и Delete соответственно (после того, как вы написали это к вашему выходному файлу).

1 голос
/ 19 ноября 2009

sort стандартно для этих заданий os-close следовать принципу DRY, механизмы -t для разделителя и -u для уникальных. Это C.

1 голос
/ 18 ноября 2009

Если вы отсортируете файл с помощью внешней сортировки перед чтением его в программе cobol, вы можете удалить дубликаты с помощью ключевого слова SORT EQUALS. Если вы сортируете файл до запуска программы на cobol и не удаляете дубликаты, тогда простое выражение IF и поле сохранения позволят вам удалить дубликаты.

Установите поле сохранения INPUTFILEID. Сразу после чтения .... ЕСЛИ inputfileid равен inputfileid-save, прочитайте еще раз, если не запись ... после записи переместите inputfileid в inputfileid-save. Вам придется разбить текущее исполнение, чтобы сделать это.

Если вы не до конца понимаете, о чем я говорю, и поможете изменить код, просто дайте мне знать

...