Как дубликаты могут быть удалены из файла с помощью COBOL?
Входной файл имеет записи как: 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.
Ответы
Ответ 1
Наконец, он сработал.
Вот код
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
Когда Organization
- Sequential
, запись удаляется, это последняя запись. Оператор Delete
действителен только тогда, когда последняя операция с файлом является успешным оператором Read
. Если нет, Delete
возвращает значение File Status
43. Поскольку Delete
не может возвращать значения File Status
, начиная с 2, когда файл Open
с Sequential
Access, кодирование Invalid Key
на таких a Delete
не разрешено.
Когда для файла выбран Dynamic
или Random
доступ, статус Delete
, как и Rewrite
, становится немного менее ограничительным. Удаляемая запись не должна быть предварительно прочитана. Просто заполните основную Key
информацию в описании записи для флага и введите оператор Delete
. Если запись не существует, возвращается File Status
из 23 и существует условие Invalid Key
.
Со страницы 274 из
Sams Teach Yourself COBOL за 24 часа
стр. 274 (который я только что свалил с книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки INPUTFILEID
, сделайте запись по мере прохождения вхождения данного INPUTFILEID
после ее первого появления и Delete
соответственно (после того, как вы написали это в ваш выходной файл).
Ответ 3
Если вы будете сортировать файл с внешним видом до его чтения в программе cobol, вы можете удалить дубликаты с помощью ключевого слова SORT EQUALS. Если вы сортируете файл до программы cobol и не бросаете дубликаты, то простой оператор IF и поле сохранения позволят вам удалить дубликаты.
Настройте поле INPUTFILEID-save. Сразу после чтения.... IF inputfileid равно inputfileid-save снова читает, если не писать... после записи move inputfileid в inputfileid-save. Для этого вам придется разбить текущую работу.
Если вы не полностью понимаете, что я говорю, и вы сможете изменить код, просто дайте мне знать
Ответ 4
sort является стандартным для этих задач os-close, чтобы следовать принципу DRY, gears -t для разделителя и -u для uniques. Это C.