Hola. Os dejo un jcl que os puede sacar de un apuro en más de una ocasión (a mí me salvó más de una vez).
Se trata de un procesito fácil, barato y para toda la familia, que nos permite averiguar que registros de un fichero están duplicados, cuales no y cuantos son.
Como siempre, para que quede más claro seguiré un ejemplo práctico, válido para cualquier caso:
Supongamos que tenemos el siguiente fichero con los duplicados:
----+----1----+----2----+----3----+----4----+----5----
***************************** Top of Data ************
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
...
Vemos que Javier y Yolanda salen repetidos, Yolanda icluso viene 3 veces. A simple vista los vemos porque el ejemplo está preparado para ello, pero imaginate que el fichero tuviera 100.000 registros y solo 2 duplicados, se complica la búsqueda no? continuamos:
PASO1 - Lo primero que haremos será ordenar el fichero por la clave (en este caso son las primeras 9 posiciones) y después poner un 1 al final de cada uno de los registros del fichero, para ello:
//PASO001 EXEC SORTD
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=nombre_fichero_con_diplicados1,DISP=SHR
//SORTOUT DD DSN=nombre_fichero_salida1_paso001,
// DISP=(,CATLG),
// SPACE=(CYL,(100,100),RLSE)
//SYSIN DD *
SORT FIELDS=(1,9,ZD,A)
OUTREC FIELDS=(1,54,C'1')
El fichero quedará del siguiente modo:
----+----1----+----2----+----3----+----4----+----5----+
***************************** Top of Data *************
000000001JOSE LOPEZ PITA AUTONOMO 1
000000002JAVIER MARTINEZ CARRETEROASALARIADO 1
000000002JAVIER MARTINEZ CARRETEROASALARIADO 1
000000003CARLOS PEREZ FANO AUTONOMO 1
000000004CARLOS POLO DEL BARROAUTONOMO 1
000000005YOLANDA LOPEZ ALONSO AUTONOMO 1
000000005YOLANDA LOPEZ ALONSO AUTONOMO 1
000000005YOLANDA LOPEZ ALONSO AUTONOMO 1
000000006ANTONIO VILLA SUSO AUTONOMO 1
000000007FULANITO VILLA SUSO AUTONOMO 1
...
PASO2 - Ahora lo que haremos será agrupar los registros por clave y utilizar el numeríto (1) que hemos introducido para sumar los registros que agrupemos:
//PASO002 EXEC SORTD
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=nombre_fichero_salida1_paso001,DISP=SHR
//SORTOUT DD DSN=nombre_fichero_salida,
// DISP=(,CATLG),
// SPACE=(CYL,(100,100),RLSE)
//SYSIN DD *
SORT FIELDS=(1,9,ZD,A)
SUM FIELDS=(55,1,ZD)
Obtendremos el resultado siguiente:
----+----1----+----2----+----3----+----4----+----5----+
***************************** Top of Data *************
000000001JOSE LOPEZ PITA AUTONOMO 1
000000002JAVIER MARTINEZ CARRETEROASALARIADO 2
000000003CARLOS PEREZ FANO AUTONOMO 1
000000004CARLOS POLO DEL BARROAUTONOMO 1
000000005YOLANDA LOPEZ ALONSO AUTONOMO 3
000000006ANTONIO VILLA SUSO AUTONOMO 1
000000007FULANITO VILLA SUSO AUTONOMO 1
...
Bien, ahora simplemente hacemos busquedas en el fichero teniendo en cuenta lo siguiente:
- Si el numerito introducido al final de cada registro no ha variado (si vale 1), quiere decir que el registro no está duplicado
- Si ha variado el valor querra decir que el registro estaba duplicado y nos dirá el número de veces que está duplicado.
Según el ejemplo vemos como Javier tiene un 2 porque está repetido dos veces, Yolanda tiene un 3 porque está repetida 3 veces, y el resto tienen un 1 porque no están repetidos.
Así de facil!
Otros casos útiles:
En algunas ocasiones queremos camparar dos ficheros para encontrar las direfencias, por ejemplo, suponte que deberían de ser iguales pero uno de ellos tiene 3 registros más que el otro, y que esto pueda ser debido algún registro duplicado.
Para resolverlo, podéis aplicar este mismo método, aplicando el PASO1 a los dos ficheros y luego metiendo los dos ficheros en el PASO2. Te dirá que registros son únicos(tanto de un fichero como del otro), cuales no lo són y el número de los que estén repetidos.
Espero que os haya servido, no obstante cualquier duda comentarla.
Mostrando entradas con la etiqueta duplicados. Mostrar todas las entradas
Mostrando entradas con la etiqueta duplicados. Mostrar todas las entradas
lunes, 16 de mayo de 2011
lunes, 17 de enero de 2011
SORT vol.5: SUM.
La estructura general de un SORT es la siguiente:
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2(opcional),DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=CYL,500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
…
…
PGM=SORT --> Indica el programa a utilizar, en este caso el SORT.
PARM=('DYNALLOC=(SYSALLDA,32)') --> Cantidad de memoria que se da a la ejecución del paso. Si se queda corto, aumentarla en valores de 8,12,32,64,128, 256 (como las memorias RAM)
SORTIN --> Ficheros de entrada
SORTOUT --> Ficheros de salida
SYSIN --> Indica el tipo de sort a realizar, las opciones disponibles son muchas y muy variadas, pudiendo utilizarse varias juntas en un mismo paso. Algunas de ellas son SORT, SUM, OMIT, INCLUDE, INREC, OUTREC, OUTFIL, OPTION … .
En este documento se explica en detalle algunas de estas funciones:
SUM
SUM FIELDS.
Suma los valores del campo especificado. Sólo pueden sumarse campos ZD(numéricos), PD(comprimidos) o BI(hexadecimales). El resultado de la suma se guarda en un registro:
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(I,L,T,O)
SUM FIELDS=(I,L,T)
/*
I – Inicio. Posición donde empieza el campo.
L – Longitud máxima del campo.
T – Tipo de dato del campo que se quiere sumar:
CH - Alfanumérico o numérico normal(sin COMP)
ZD - Numérico normal(sin COMP)
BI - Hexadecimal (campos COMP)
PD - Empaquetado con o sin signo(campos COMP-3)
O – Orden. A-Ascendente, D- Descendente
Ejemplo:
Ordenar el siguiente fichero por código de empresa y acumular el saldo para cada una de ellas:
----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00110000
000000001EMPRESA LANAS MARUJA 00220000
000000002EMPRESA CAFETERIA NOVELTY 00090000
000000004EMPRESA ASESORIA ASOCIA 00100000
000000002EMPRESA CAFETERIA NOVELTY 00110000
000000004EMPRESA ASESORIA ASOCIA 00160000
Fórmula:
SORT FIELDS=(1,9,CH,A)
SUM FIELDS=(36,8,ZD)
Resultado:
----+----1----+----2----+----3----+----4----+
000000001EMPRESA LANAS MARUJA 00220000
000000002EMPRESA CAFETERIA NOVELTY 00310000
000000004EMPRESA ASESORIA ASOCIA 00260000
Lo que hace el SUM FIELDS es sacar un registro por cada campo distinto que haya en las posiciones indicadas en el SORT. En esos registros acumulará la cantidad que vaya en las posiciones indicadas por el SUM FIELDS.
Otra utilidad del SUM es la de eliminar duplicados.
Para eliminar registros que tengan un campo en concreto duplicado, indicaremos en la parte del SORT el campo que traerá los duplicados:
SORT FIELDS=(I,L,T,O)
SUM FIELDS=NONE
Ejemplo:
Eliminar los registros con código de empresa duplicado del siguiente fichero:
----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00111111
000000001EMPRESA LANAS MARUJA 00222222
000000002EMPRESA CAFETERIA NOVELTY 00333333
000000004EMPRESA ASESORIA ASOCIA 00444444
000000002EMPRESA CAFETERIA NOVELTY 00555555
000000004EMPRESA ASESORIA ASOCIA 00666666
Fórmula:
SORT FIELDS=(1,9,CH,A)
SUM FIELDS=NONE
Resultado:
----+----1----+----2----+----3----+----4----+
000000001EMPRESA LANAS MARUJA 00222222
000000002EMPRESA CAFETERIA NOVELTY 00111111
000000004EMPRESA ASESORIA ASOCIA 00444444
En la salida mostrará el primer registro (por el orden indicado) de cada código de empresa.
En el SORT FIELDS podemos utilizar cualquiera de los campos del fichero. Por ejemplo, podríamos indicar que ordenase por nombre de la empresa:
----+----1----+----2----+----3----+----4----+
000000001EMPRESA CAFETERIA NOVELTY 00111111
000000003EMPRESA LANAS MARUJA 00222222
000000003EMPRESA CAFETERIA NOVELTY 00333333
000000004EMPRESA ASESORIA ASOCIA 00444444
000000004EMPRESA CAFETERIA NOVELTY 00555555
000000006EMPRESA ASESORIA ASOCIA 00666666
Fórmula:
SORT FIELDS=(10,26,CH,A)
SUM FIELDS=NONE
Resultado:
----+----1----+----2----+----3----+----4----+
000000004EMPRESA ASESORIA ASOCIA 00444444
000000001EMPRESA CAFETERIA NOVELTY 00111111
000000003EMPRESA LANAS MARUJA 00222222
El resultado es que se han eliminado los registros con nombre de empresa duplicado.
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2(opcional),DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=CYL,500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
…
…
PGM=SORT --> Indica el programa a utilizar, en este caso el SORT.
PARM=('DYNALLOC=(SYSALLDA,32)') --> Cantidad de memoria que se da a la ejecución del paso. Si se queda corto, aumentarla en valores de 8,12,32,64,128, 256 (como las memorias RAM)
SORTIN --> Ficheros de entrada
SORTOUT --> Ficheros de salida
SYSIN --> Indica el tipo de sort a realizar, las opciones disponibles son muchas y muy variadas, pudiendo utilizarse varias juntas en un mismo paso. Algunas de ellas son SORT, SUM, OMIT, INCLUDE, INREC, OUTREC, OUTFIL, OPTION … .
En este documento se explica en detalle algunas de estas funciones:
SUM
SUM FIELDS.
Suma los valores del campo especificado. Sólo pueden sumarse campos ZD(numéricos), PD(comprimidos) o BI(hexadecimales). El resultado de la suma se guarda en un registro:
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(I,L,T,O)
SUM FIELDS=(I,L,T)
/*
I – Inicio. Posición donde empieza el campo.
L – Longitud máxima del campo.
T – Tipo de dato del campo que se quiere sumar:
CH - Alfanumérico o numérico normal(sin COMP)
ZD - Numérico normal(sin COMP)
BI - Hexadecimal (campos COMP)
PD - Empaquetado con o sin signo(campos COMP-3)
O – Orden. A-Ascendente, D- Descendente
Ejemplo:
Ordenar el siguiente fichero por código de empresa y acumular el saldo para cada una de ellas:
----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00110000
000000001EMPRESA LANAS MARUJA 00220000
000000002EMPRESA CAFETERIA NOVELTY 00090000
000000004EMPRESA ASESORIA ASOCIA 00100000
000000002EMPRESA CAFETERIA NOVELTY 00110000
000000004EMPRESA ASESORIA ASOCIA 00160000
Fórmula:
SORT FIELDS=(1,9,CH,A)
SUM FIELDS=(36,8,ZD)
Resultado:
----+----1----+----2----+----3----+----4----+
000000001EMPRESA LANAS MARUJA 00220000
000000002EMPRESA CAFETERIA NOVELTY 00310000
000000004EMPRESA ASESORIA ASOCIA 00260000
Lo que hace el SUM FIELDS es sacar un registro por cada campo distinto que haya en las posiciones indicadas en el SORT. En esos registros acumulará la cantidad que vaya en las posiciones indicadas por el SUM FIELDS.
Otra utilidad del SUM es la de eliminar duplicados.
Para eliminar registros que tengan un campo en concreto duplicado, indicaremos en la parte del SORT el campo que traerá los duplicados:
SORT FIELDS=(I,L,T,O)
SUM FIELDS=NONE
Ejemplo:
Eliminar los registros con código de empresa duplicado del siguiente fichero:
----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00111111
000000001EMPRESA LANAS MARUJA 00222222
000000002EMPRESA CAFETERIA NOVELTY 00333333
000000004EMPRESA ASESORIA ASOCIA 00444444
000000002EMPRESA CAFETERIA NOVELTY 00555555
000000004EMPRESA ASESORIA ASOCIA 00666666
Fórmula:
SORT FIELDS=(1,9,CH,A)
SUM FIELDS=NONE
Resultado:
----+----1----+----2----+----3----+----4----+
000000001EMPRESA LANAS MARUJA 00222222
000000002EMPRESA CAFETERIA NOVELTY 00111111
000000004EMPRESA ASESORIA ASOCIA 00444444
En la salida mostrará el primer registro (por el orden indicado) de cada código de empresa.
En el SORT FIELDS podemos utilizar cualquiera de los campos del fichero. Por ejemplo, podríamos indicar que ordenase por nombre de la empresa:
----+----1----+----2----+----3----+----4----+
000000001EMPRESA CAFETERIA NOVELTY 00111111
000000003EMPRESA LANAS MARUJA 00222222
000000003EMPRESA CAFETERIA NOVELTY 00333333
000000004EMPRESA ASESORIA ASOCIA 00444444
000000004EMPRESA CAFETERIA NOVELTY 00555555
000000006EMPRESA ASESORIA ASOCIA 00666666
Fórmula:
SORT FIELDS=(10,26,CH,A)
SUM FIELDS=NONE
Resultado:
----+----1----+----2----+----3----+----4----+
000000004EMPRESA ASESORIA ASOCIA 00444444
000000001EMPRESA CAFETERIA NOVELTY 00111111
000000003EMPRESA LANAS MARUJA 00222222
El resultado es que se han eliminado los registros con nombre de empresa duplicado.
Suscribirse a:
Entradas (Atom)