2009-04-27 7 views
5

두 개의 입력 파일이 있는데 각각 길이가 5200 바이트입니다. 7 바이트 키는 두 파일을 비교하는 데 사용됩니다. 일치하는 항목이있는 경우 "일치"파일에 기록해야하지만 일치하는 파일에 쓰는 동안 의 필드와 infile2의 다른 모든 필드가 필요합니다.두 파일을 비교하여 "match"및 "nomatch"파일에 쓰십시오.

일치하는 항목이 없으면 no match 파일에 기록하십시오.

sort에서 할 수 있습니까? COBOL 프로그램을 사용하여 쉽게 수행 할 수 있지만 단지 SORT/ICETOOL/Easytrieve Plus (EZTPA00)에 대해 알고 싶습니다.

답변

0

나는 약 2 년 전 JCL을 사용 했으므로 코드를 작성할 수는 없지만 여기에 아이디어가있다.

  1. 당신이 일치하는 파일에 일치하는 레코드를 작성할 수
  2. 첫 번째 단계는 ICETOOl을해야합니다 2 단계 되세요.
  3. 두 번째로 SORT/ICETOOl을 사용하거나 파일 작업만으로 불일치 파일을 작성할 수 있습니다.

다시 나는 코드가없는 솔루션을 드려 죄송합니다,하지만 난 2 세에 의해 터치에서 오전 +

+0

필요하지 마십시오 두 단계. ICETOOL이 필요하지 않습니다. JOINKEYS와 SORT가 그것을 할 것입니다. 어쨌든 묘사 된 것에서. –

0
는, 아래 당신이 그것을 코드 수있는 방법을 예를 들어 정말 쉬운 것 Eztrieve에서

:

//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은 어디에서 왔는지 모르기 때문에 꽤 쓸모가 없습니다. TS/OP가이 질문을 받았어야합니다. 2009 년. 중복을 다루지 않습니다. 다행히도 중복이 없다고 말하자. 파일이 키순으로 정렬되어 있는지 확인 했습니까? 아니? 그러면 작동하지 않습니다. 이 프로그램은 가변 길이 레코드에서도 작동하도록 만들 수 있습니다. 이 것 이외에, 이것은 좋게 본다. –

0

은 이 질문이 정말로 오랫동안 게시되었지만 다른 사람들에게 도움이 될 수 있기 때문에 대답하고 싶습니다. 이 작업은 단일 단계에서 JOINKEYS을 사용하여 쉽게 수행 할 수 있습니다. 다음은 의사 코드입니다 :

  • 코드 JOINKEYS PAIRED(implicit) 두 형식의 레코드를 모두 다시 포맷하십시오. 두 파일 중 하나와 일치하는 것이 없으면 일부 특수 문자를 붙이거나 접두어로 말하십시오. '$'
  • '$'에 대해 IFTHEN을 통해 비교하면 일치하는 레코드가 없으면 쌍을 이루지 않은 파일에 기록되고 쌍 파일 .

질문이 있으시면 다시 방문해주십시오.

+0

페어링 된 레코드 만 처리하는 경우 불일치가 발생하지 않습니다. SyncSort 대신 DFSORT를 사용하는 경우 '$'는 필요하지 않지만 내장 된 일치 표식을 사용할 수 있습니까? (그것은 일치 표식이 무엇인지, 그것은 질문이 아닙니다). –

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

이것은 전혀 일치하지 않으며 F1에서만 일치하지 않습니다. –

8

12,200부터 사람들은이 질문 쳐다 보면서 대답을 얻지 않았다 :

는 DFSORT 및 SyncSort가 제품을 분류 지배적 인 메인 프레임입니다. 그들의 컨트롤 카드에는 많은 유사점과 몇 가지 차이점이 있습니다.

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  

"JOINKEYS"는 세 가지 작업으로 구성됩니다. 하위 작업 1은 첫 번째 조인스입니다. 하위 작업 2는 두 번째 조깅입니다. Main Task가 따라 와서 조인 된 데이터가 처리됩니다. 위의 예에서 간단한 COPY 조작입니다. 결합 된 데이터는 단순히 SORTOUT에 기록됩니다.

JOIN 문은 일치하는 레코드뿐만 아니라 UNPAIRED F1 및 F2 레코드가 주 태스크에 제공되도록 정의합니다.

REFORMAT 문은 주 태스크에 표시 될 레코드를 정의합니다.보다 효율적인 예는 3 개 개의 필드 F2로부터 필요한 것을 상상이다

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

F2의 각 필드는

개시 위치 및 길이로 정의된다.

메인 태스크에 의해 처리되는 레코드는 5311 바이트이고 F2 레코드는 520110521115212100으로 참조 할 수 있으며 F1 레코드는 1,5200입니다.

더 나은 방법은 JNF2CNTL을 사용하여 F2의 크기를 줄이는 것입니다. SyncSort가

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

JNF2CNTL 일부 설치를 지원하지 않으며, (Z/OS 릴리스 1.4.1.0 이후 대한 Syncsort에서 MFX부터) 지원되는 경우에도, 그것은 Syncsort에서 설명되지 않는다. 1.3.2 또는 1.4.0의 사용자는 JNFnCNTL 지원을 제공하기 위해 SyncSort에서 업데이트를 사용할 수 있습니다.

JOINKEYS는 기본적으로 EQUALS 옵션을 사용하여 데이터를 정렬합니다. JOINKEYS 파일의 데이터가이 L 순서대로 나열되면 SORTED가 지정되어야합니다. DFSORT의 경우 순서 점검이 필요하지 않은 경우 NOSEQCHK를 지정할 수도 있습니다.

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

소스 파일을 판별 할 수 없으므로 요청이 이상한하지만

, 모든 타의 추종을 불허하는 기록은 별도의 출력 파일로 이동한다.

DFSORT에는?로 지정된? REFORMAT에서 :

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

이렇게하면 REFORMAT 레코드 길이가 1 바이트 증가합니다. ? REFORMAT 레코드의 아무 곳에서나 지정할 수 있으므로 지정하지 않아도됩니다. ? DFSORT에 의해 다음과 같이 해결됩니다. B, 두 파일에서 출처가 된 데이터. 1, F1에서 타의 추종을 불허하는 기록; 2, F2에서 타의 추종을 불허하는 기록.

SyncSort에는 일치 표식이 없습니다. REFORMAT 레코드에 데이터가 없거나 존재하는지 여부는 값으로 결정되어야합니다. 특정 값을 포함 할 수없는 두 입력 레코드의 바이트를 선택하십시오 (예 : 숫자 내에서, 숫자가 아닌 값으로 결정). 그런 다음 해당 값을 REFORMAT의 FILL 문자로 지정하십시오.

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

F1에 위치 한이 자연스럽게 하나, 다음 두 위치가 일치하는 결과를 설정하는 데 사용할 수 없습니다 F2의 "$"위치 (20)을 할 수 없습니다. 필요한 경우 전체 레코드를 테스트 할 수 있지만 더 많은 CPU 시간을 소모합니다.

명백한 요구 사항은 F1 또는 F2의 일치하지 않는 모든 레코드를 하나의 파일에 기록하는 것입니다.

DFSORT, 출력 타의 추종을 불허하는 기록 :

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가 출력 타의 추종을 불허하는 기록이 자신의 전체를 모두 기록을 포함하는 포맷 문을 필요로 SyncSort가에 대한 코딩 것 또한

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)) 

DFSORT로 작업하십시오.

작성된 일치하는 레코드를 얻는 것은 쉽습니다.

OUTFIL FNAMES=MATCH,SAVE 

SAVE는 다른 OUTFIL이 작성하지 않은 모든 레코드가 여기에 기록되도록합니다.

주로 F1에서 데이터를 출력하고 F2에서 일부 필드를 선택하기 위해 일부 재 형식화가 필요합니다. 이 DFSORT 또는 SyncSort가 하나를 위해 작동합니다 : 임의의 시작과 길이와

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

모든 것은이있다 :

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)