file - usar - ¿Cómo se pueden eliminar los duplicados de un archivo utilizando COBOL?
eliminar duplicados cobol (4)
El archivo de entrada tiene registros como: 8712351,8712353,8712353,8712354,8712356,8712352,8712355 8712352,8712355
Usando COBOL necesito eliminar duplicados del archivo anterior y escribir en un archivo de salida. Escribí lógica simple para leer registros y escribir en un archivo de salida.
¿Dónde debo poner la lógica de eliminar duplicados (por ejemplo, 8712353,8712352) del archivo anterior? Aquí está la lógica del programa:
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.
Ordene el archivo de entrada en orden ascendente como: 8712351,8712353,8712353,8712354,8712356,8712352,8712355,8712352,8712355 Y funcionó, a continuación se muestra el código modificado:
Pero supongamos que si mi archivo no está en orden ascendente o descendente en el que necesito escribir la lógica de clasificación antes de eliminar dups. por favor, puede actualizar mi código de abajo para esto, ya que lo intenté pero no tengo éxito en hacer esto si la estructura del campo de entrada es como:
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.
Cuando Organization
es Sequential
, el registro eliminado es el último registro leído. La declaración de Delete
es válida solo cuando la última operación contra el archivo es una declaración de Read
exitosa. De lo contrario, la Delete
devuelve un valor de File Status
de 43. Debido a que la Delete
no puede devolver los valores de File Status
que comienzan con un 2 cuando el archivo está Open
con acceso Sequential
, no se permite la codificación de la Invalid Key
en dicha Delete
.
Cuando se selecciona el acceso Dynamic
o Random
para el archivo, la declaración Delete
, como la Rewrite
, se vuelve un poco menos restrictiva. El registro que se está eliminando no necesita tener una lectura previa. Simplemente complete la información de la Key
principal en la descripción del registro para el archivo y emita la declaración Delete
. Si el registro no existe, se devuelve un File Status
de File Status
de 23 y existe una condición de Invalid Key
no válida.
De la página 274 de
Sams te enseña COBOL en 24 horas
página 274 (que acabo de desempolvar de mi librero). Entonces, en su caso, presumiblemente configurará sus registros para que sean ordenados por INPUTFILEID
, haga un registro a medida que avance de ocurrencias de un INPUTFILEID
dado INPUTFILEID
allá de su primera ocurrencia, y Delete
consiguientemente (después de haberlo escrito en su archivo de salida) .
Finalmente funcionó. Aquí está el código
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.
Si ordenará el archivo con una clasificación externa antes de leerlo en el programa cobol, puede eliminar los duplicados con la palabra clave CLASIFICAR IGUALES. Si ordena el archivo antes del programa cobol y no elimina los duplicados, entonces una simple declaración IF y un campo de guardar le permitirán eliminar los dups.
Configure un campo de guardado de INPUTFILEID. Justo después de la lectura ... IF inputfileid igual inputfileid-save vuelva a leer si no escribe ... después de la escritura mueva inputfileid a inputfileid-save. Tendrás que dividir el rendimiento actual para hacer esto.
Si no entiende completamente lo que estoy diciendo y lo ayudará a cambiar el código, hágamelo saber
sort es estándar para estos trabajos de cierre del sistema a seguir el principio DRY, engranajes -t para el separador y -u para los únicos. Es C.