2009-04-27 17 views
5

Tengo dos archivos de entrada, cada uno con una longitud de 5200 bytes. Se usa una clave de siete bytes para comparar ambos archivos, si hay una coincidencia, entonces debe escribirse en el archivo "coincidencia", pero al escribir para hacer coincidir el archivo necesito algunos campos del infile1 y todos los demás campos del infile2.Compara dos archivos y escríbelo en los archivos "coincidencia" y "nomatch"

Si no hay coincidencia, escriba al archivo no match.

¿Es posible hacerlo en sort? Sé que se puede hacer fácilmente usando el programa COBOL, pero solo quiero saberlo en SORT/ICETOOL/Easytrieve Plus (EZTPA00).

Respuesta

0

Había usado JCL hace unos 2 años, así que no puedo escribir un código para ti, pero esta es la idea;

  1. tienen 2 pasos
  2. primer paso será tener ICETOOl donde se puede escribir a los registros coincidentes de archivos compatible.
  3. En segundo lugar, puede escribir un archivo que no coincida utilizando SORT/ICETOOl o solo con operaciones de archivos.

de nuevo me disculpo por solución sin código, pero estoy fuera de contacto por 2 años +

+0

no es necesario dos pasos. No necesita ICETOOL. SORT con JOINKEYS lo hará. De lo que se describe, de todos modos. –

0

En Eztrieve que es muy fácil, a continuación es un ejemplo de cómo podría codificar es:

//STEP01 EXEC PGM=EZTPA00           
//FILEA DD DSN=FILEA,DISP=SHR 
//FILEB DD DSN=FILEB,DISP=SHR 
//FILEC DD DSN=FILEC.DIF,  
//   DISP=(NEW,CATLG,DELETE),        
//   SPACE=(CYL,(100,50),RLSE),       
//   UNIT=PRMDA,           
//   DCB=(RECFM=FB,LRECL=5200,BLKSIZE=0)     
//SYSOUT DD SYSOUT=*            
//SRTMSG DD SYSOUT=*            
//SYSPRINT DD SYSOUT=*            
//SYSIN DD *              
FILE FILEA               
    FA-KEY  1 7 A           
    FA-REC1  8 10 A 
    FA-REC2  18 5 A 

FILE FILEB               
    FB-KEY  1 7 A           
    FB-REC1  8 10 A           
    FB-REC2  18 5 A           

FILE FILEC               

FILE FILED               
    FD-KEY  1 7 A           
    FD-REC1  8 10 A           
    FD-REC2  18 5 A           


JOB INPUT (FILEA KEY FA-KEY FILEB KEY FB-KEY)      
    IF MATCHED    
     FD-KEY = FB-KEY          
     FD-REC1 = FA-REC1 
     FD-REC2 = FB-REC2 
     PUT FILED 
    ELSE 
     IF FILEA 
     PUT FILEC FROM FILEA           
     ELSE 
     PUT FILEC FROM FILEB 
     END-IF           
    END-IF               
/*      
+0

FILEC va a ser bastante inútil, ya que no sabrá qué ha venido de dónde. TS/OP debería haberse preguntado esto. En el año 2009. No trata con duplicados. Afortunadamente, digamos que no hay duplicados. ¿Se aseguró de que los archivos estén en orden por clave? ¿No? No funcionará entonces. El programa también se puede hacer funcionar para registros de longitud variable. Aparte de estas cosas, esto se ve bien. –

0

Aunque hace mucho tiempo que se publicó esta pregunta, deseo responder, ya que podría ayudar a otros. Esto se puede hacer fácilmente por medio de JOINKEYS en un solo paso. Aquí va el pseudocódigo:

  • Código JOINKEYS PAIRED(implicit) y obtenga ambos registros a través del reformateo archivado. Si NO hay coincidencia entre ninguno de los archivos, añada/prefija un carácter especial, digamos '$'
  • Compare via IFTHEN para '$', si existe, entonces no tiene un registro emparejado, se escribirá en un archivo no apareado y reposará en un archivo vinculado .

Por favor, vuelva en caso de que tenga alguna pregunta.

+0

Si solo maneja registros emparejados, no obtendrá ningún desajuste. Si DFSORT en lugar de SyncSort, no necesita el '$', ¿pero puede usar el marcador de coincidencia incorporado? (Ese es el marcador del partido, no es una pregunta). –

0
//STEP01 EXEC SORT90MB       
//SORTJNF1 DD DSN=INPUTFILE1, 
//   DISP=SHR       
//SORTJNF2 DD DSN=INPUTFILE2, 
//   DISP=SHR       
//SORTOUT DD DSN=MISMATCH_OUTPUT_FILE, 
//   DISP=(,CATLG,DELETE),    
//   UNIT=TAPE,       
//   DCB=(RECFM=FB,BLKSIZE=0),   
//   DSORG=PS       
//SYSOUT DD SYSOUT=*       
//SYSIN DD *         
    JOINKEYS FILE=F1,FIELDS=(1,79,A)    
    JOINKEYS FILE=F2,FIELDS=(1,79,A)    
    JOIN UNPAIRED,F1,ONLY       
    SORT FIELDS=COPY        
/*            
+0

Esto no tendrá ninguna coincidencia, y no coincide solo con F1. –

8

Desde 12.200 personas han mirado a esta pregunta y no tiene una respuesta:

DFSORT y Syncsort son la unidad central predominante clasificar productos. Sus tarjetas de control tienen muchas similitudes y algunas diferencias.

JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A)    
JOINKEYS FILE=F2,FIELDS=(key2startpos,7,A)    
JOIN UNPAIRED,F1,F2 
REFORMAT FIELDS=(F1:1,5200,F2:1,5200)       
SORT FIELDS=COPY  

A "JOINKEYS" está formado por tres tareas. La Subtarea 1 es la primera JOINKEYS. Subtarea 2 es el segundo JOINKEYS. La tarea principal sigue y es donde se procesan los datos unidos. En el ejemplo anterior, es una operación COPY simple. Los datos unidos simplemente se escribirán en SORTOUT.

La declaración JOIN define que, además de los registros coincidentes, los registros UNPAIRED F1 y F2 se deben presentar en la tarea principal.

La instrucción REFORMAT define el registro que se presentará en la tarea principal.Un ejemplo más eficiente, imaginando que se requieren tres campos de F2, es:

REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100) 

Cada uno de los campos en F2 se define con una posición de inicio y una longitud.

El registro que luego procesa la tarea Principal tiene 5311 bytes de largo, y los campos de F2 se pueden consultar en 5201,10,5211,1,5212,100 con el registro F1 en 1,5200.

Una forma mejor de lograr lo mismo es reducir el tamaño de F2 con JNF2CNTL.

//JNF2CNTL DD * 
    INREC BUILD=(207,1,10,30,1,5100,100) 

Algunas instalaciones de Syncsort no son compatibles con JNF2CNTL, e incluso si son compatibles (de Syncsort MFX para la liberación z/OS 1.4.1.0 en adelante), no está documentado por Syncsort. Para los usuarios de 1.3.2 o 1.4.0, SyncSort ofrece una actualización para proporcionar el soporte de JNFnCNTL.

Se debe tener en cuenta que JOINKEYS clasifica por defecto los datos, con la opción IGUAL. Si los datos de un archivo JOINKEYS ya están en secuencia, se debe especificar SORTED. Para DFSORT NOSEQCHK también se puede especificar si no se requiere la verificación de secuencia.

JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A),SORTED,NOSEQCHK 

Aunque la solicitud es extraño, ya que el archivo de origen no podrá ser determinada, todos los registros no coincidentes son para ir a un archivo de salida independiente.

Con DFSORT, hay un marcador coincidente, especificado con? en la REFORMAT:

REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100,?) 

Esto aumenta la longitud del registro REFORMAT en un byte. Los ? se puede especificar en cualquier parte del registro REFORMAT, y no es necesario especificarlo. Los ? se resuelve mediante DFSORT a: B, datos de ambos archivos; 1, registro sin igual de F1; 2, registro sin igual de F2.

SyncSort no tiene el marcador de coincidencia. La ausencia o presencia de datos en el registro REFORMAT debe estar determinada por valores. Elija un byte en ambos registros de entrada que no pueden contener un valor particular (por ejemplo, dentro de un número, decida un valor no numérico). Luego, especifique ese valor como el carácter FILL en la REFORMAT.

REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100),FILL=C'$' 

Si la posición 1 en la F1 no puede, naturalmente, tienen "$" y la posición 20 en la F2 no pueden tampoco, entonces esas dos posiciones pueden ser utilizados para establecer el resultado del partido. El registro completo se puede probar si es necesario, pero absorbe más tiempo de CPU.

El requisito aparente es que todos los registros no coincidentes, desde F1 o F2, se escriban en un archivo. Esto requerirá una declaración REFORMAT que incluye tanto los registros en su totalidad:

DFSORT, salida de registros no coincidentes:

REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?) 

    OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'), 
     IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'), 
        BUILD=(1,5200)), 
     IFTHEN=(WHEN=NONE, 
        BUILD=(5201,5200)) 

Syncsort, salida de registros no coincidentes:

REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$' 

    OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$', 
          OR,5220,1,CH,EQ,C'$'), 
     IFTHEN=(WHEN=(1,1,CH,EQ,C'$'), 
        BUILD=(1,5200)), 
     IFTHEN=(WHEN=NONE, 
        BUILD=(5201,5200)) 

La codificación para Syncsort también trabajar con DFSORT.

Para obtener los registros coincidentes escritos es fácil.

OUTFIL FNAMES=MATCH,SAVE 

GUARDAR asegura que todos los registros no escritos por otro OUTFIL se escribirán aquí.

Se necesita reformatear, principalmente para generar datos de F1, pero para seleccionar algunos campos de F2. Esto funcionará para cualquiera DFSORT o Syncsort:

OUTFIL FNAMES=MATCH,SAVE, 
    BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929) 

La cosa entera, con arranques y longitudes arbitrarias es:

DFSORT

JOINKEYS FILE=F1,FIELDS=(1,7,A)    
    JOINKEYS FILE=F2,FIELDS=(20,7,A)  

    JOIN UNPAIRED,F1,F2 

    REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)       

    SORT FIELDS=COPY  

    OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'), 
     IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'), 
        BUILD=(1,5200)), 
     IFTHEN=(WHEN=NONE, 
        BUILD=(5201,5200)) 

    OUTFIL FNAMES=MATCH,SAVE, 
    BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929) 

Syncsort

JOINKEYS FILE=F1,FIELDS=(1,7,A)    
    JOINKEYS FILE=F2,FIELDS=(20,7,A)    

    JOIN UNPAIRED,F1,F2 

    REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'       

    SORT FIELDS=COPY  

    OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$', 
          OR,5220,1,CH,EQ,C'$'), 
     IFTHEN=(WHEN=(1,1,CH,EQ,C'$'), 
        BUILD=(1,5200)), 
     IFTHEN=(WHEN=NONE, 
        BUILD=(5201,5200)) 

    OUTFIL FNAMES=MATCH,SAVE, 
    BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929) 
Cuestiones relacionadas