2009-04-27 33 views
5

Ho due file di input, ciascuno con una lunghezza di 5200 byte. Una chiave da sette byte è usata per confrontare entrambi i file, se c'è una corrispondenza, allora deve essere scritta nel file "match" ma mentre si scrive per abbinare il file ho bisogno di alcuni campi da infile1 e tutti gli altri campi da infile2.Confronta due file e scrivilo nei file "match" e "nomatch"

Se non c'è corrispondenza, scrivere sul file no match.

E 'possibile farlo in sort? So che può essere fatto facilmente usando il programma COBOL ma voglio solo sapere in SORT/ICETOOL/Easytrieve Plus (EZTPA00).

risposta

0

Avevo usato JCL circa 2 anni fa, quindi non posso scrivere un codice per te ma ecco l'idea;

  1. avere 2 passi
  2. Il primo passo dovrà ICETOOl cui è possibile scrivere i record corrispondenti ai file corrispondente.
  3. In secondo luogo è possibile scrivere un file non corrispondente utilizzando SORT/ICETOOl o semplicemente operazioni sui file.

di nuovo mi scuso per soluzione senza codice, ma io sono in contatto da 2 anni +

+0

non è necessario due passi. Non serve ICETOOL. SORT con JOINKEYS lo farà. Da quanto descritto, comunque. –

0

In Eztrieve è davvero facile, qui di seguito è un esempio di come è possibile codificare esso:

//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 sarà piuttosto inutile, dato che non saprai cosa è venuto da dove. TS/OP avrebbe dovuto essere chiesto questo. Indietro nel 2009. Non si occupa di duplicati. Per fortuna, diciamo solo no duplicati. Ti sei assicurato che i file siano in ordine per chiave? No? Non funzionerà allora. Il programma può anche essere fatto funzionare per record a lunghezza variabile. Oltre a queste cose, questo sembra buono. –

0

Anche se la sua domanda è stata molto lunga, vorrei rispondere in quanto potrebbe aiutare gli altri. Questo può essere fatto facilmente per mezzo di JOINKEYS in un SINGOLO passo. Ecco lo pseudo codice:

  • Codice JOINKEYS PAIRED(implicit) e ottenere entrambi i record tramite file di riformattazione. Se non vi è alcuna corrispondenza da uno dei due file, aggiungere/prefisso un carattere speciale dire '$'
  • Confrontare tramite IFTHEN per '$', se esiste, quindi non ha un record accoppiato, verrà scritto in un file non abbinato e verrà riposto nel file associato .

Si prega di tornare in caso di domande.

+0

Se gestisci solo i record associati, non otterrai alcuna discrepanza. Se DFSORT invece di SyncSort, non è necessario il '$', ma è possibile utilizzare l'indicatore di corrispondenza incorporato? (questo è l'indicatore della partita, non è una domanda). –

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

Questo non ha alcuna corrispondenza e non corrisponde solo alla F1. –

8

Dal 12.200 persone hanno guardato a questa domanda e non ha ottenuto una risposta:

DFSORT e SyncSort sono Mainframe predominante di smistamento dei prodotti. Le loro carte di controllo hanno molte somiglianze e alcune differenze.

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  

Un "JOINKEYS" è composto da tre attività. Sub-Task 1 è il primo JOINKEYS. Sub-Task 2 è il secondo JOINKEYS. Segue l'attività principale ed è dove vengono elaborati i dati uniti. Nell'esempio sopra riportato è una semplice operazione di COPIA. I dati uniti verranno semplicemente scritti su SORTOUT.

La dichiarazione JOIN definisce che oltre ai record corrispondenti, i record F1 e F2 NON ANNULLATI devono essere presentati all'attività principale.

L'istruzione REFORMAT definisce il record che verrà presentato all'attività principale.Un esempio più efficiente, immaginando che tre campi sono obbligatori F2, è:

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

Ciascuno dei campi F2 viene definito con una posizione di partenza ed una lunghezza.

Il record che viene quindi elaborato dall'attività principale è lungo 5311 byte e i campi da F2 possono essere referenziati da 5201,10,5211,1,5212,100 con il record F1 di 1,5200.

Un modo migliore per ottenere lo stesso risultato è ridurre la dimensione di F2 con JNF2CNTL.

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

Alcuni impianti di SyncSort non supportano JNF2CNTL, e anche se supportato (da Syncsort MFX per z/OS rilascio 1.4.1.0 in poi), ma non è documentata da SyncSort. Per gli utenti di 1.3.2 o 1.4.0 è disponibile un aggiornamento da SyncSort per fornire il supporto JNFnCNTL.

Va notato che JOINKEYS di default ORDINA i dati, con l'opzione UGUALI. Se i dati per un file JOINKEYS sono già in sequenza, è necessario specificare SORTED. Per DFSORT NOSEQCHK può anche essere specificato se non è richiesto il controllo delle sequenze.

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

Anche se la richiesta è strano, come il file di origine non sarà in grado di determinare, tutti i record non corrispondenti sono di andare in un file di output separato.

Con DFSORT, è presente un indicatore di corrispondenza, specificato con? nel REFORMAT:

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

Ciò aumenta la lunghezza del record REFORMAT di un byte. Il ? può essere specificato ovunque sul record REFORMAT e non è necessario specificarlo. Il ? è risolto da DFSORT a: B, i dati provenienti da entrambi i file; 1, record senza paragoni da F1; 2, record senza paragoni da F2.

SyncSort non ha l'indicatore di corrispondenza. L'assenza o la presenza di dati nel record REFORMAT deve essere determinata in base ai valori. Scegli un byte su entrambi i record di input che non possono contenere un valore particolare (ad esempio, all'interno di un numero, decidi su un valore non numerico). Quindi specificare quel valore come carattere FILL sul REFORMAT.

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

Se posizione 1 in F1 non può avere naturalmente "$" e la posizione 20 sulla F2 non possono neanche, allora quei due posizioni possono essere utilizzati per determinare il risultato della partita. L'intero record può essere testato se necessario, ma aumenta il tempo di CPU.

Il requisito evidente è che tutti i record non corrispondenti, da F1 o F2, vengano scritti in un file. Ciò richiederà una dichiarazione REFORMAT che comprende entrambi i record nella loro interezza:

DFSORT, uscita record non corrispondenti:

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, uscita record non corrispondenti:

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 codifica per SyncSort sarà anche lavorare con DFSORT.

Per ottenere i record corrispondenti scritti è facile.

OUTFIL FNAMES=MATCH,SAVE 

SAVE assicura che tutti i record non scritti da un altro OUTFIL verranno scritti qui.

È necessaria una riformattazione per emettere principalmente dati da F1, ma per selezionare alcuni campi da F2. Questo funziona sia per DFSORT o SyncSort:

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

Il tutto, con partenze arbitrarie e lunghezze è:

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)