xsum usar sort eliminar duplicados como file cobol cobol85

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.