2017-02-15 3 views
0
1234 ABCD 
3991 ABCD 
3818 ABCD 
1939 PQRS 
2838 PQRS 
1939 ABCD 
2819 PQRS 
2102 FILQ 
2911 ABCD 
3912 FILQ 

파일에 ABCD가있는 모든 레코드를 쓰고 싶습니다. 파일에있는 모든 레코드 PQRS를 파일에 FILQ가있는 모든 레코드 등으로 쓰고 싶습니다. 나는이 기둥이 손 앞에 무엇이 될지 모릅니다.JCL 정렬 카드를 사용하여 데이터 세트의 열 n부터 n + k까지의 모든 레코드를 newfile에 쓸 수 있습니다. 이것을 달성하는 방법?

+0

데이터의 예를 제공하고 원하는 결과를 표시하십시오. – SaggingRufus

+0

안녕하세요. 설명에 예제를 제공했습니다. – user218324

+0

그래서 처리하기 전에 2 열에 무엇이 들어 있을지 알 수 없지만 다른 문자가 있어야합니다 값에 따라 파일? 얼마나 많은 파일이있을 수 있습니까? – SaggingRufus

답변

1

그건 당신이 즉시 변경되지 않습니다에 정렬 할 필요가 값 가정하면,이 같은 것을 사용할 수 있습니다 : 당신이 필요로

//STEP1 EXEC PGM=ICEMAN 
//SYSOUT DD SYSOUT=* 
//SYSIN DD DSN=YOUR.INPUT.FILE,DISP=OLD 
//OUT1 DD DSN=OUTPUT.FILE.ONE,DISP(NEW,CATLG), 
//   SPACE=(CYL,(5,5),UNIT=SYSDA 
//OUT2 DD DSN=OUTPUT.FILE.TWO,DISP(NEW,CATLG), 
//   SPACE=(CYL,(5,5),UNIT=SYSDA 
//SYSIN DD * 
    OPTION COPY 
    OUTFIL INCLUDE=(6,4,CH,EQ,C'ABCD'),FNAMES=OUT1 
    OUTFIL INCLUDE=(6,4,CH,EQ,C'PQRS'),FNAMES=OUT2 
/* 

는 그런 다음 여러 번이를 반복 할 수 있습니다.

기본적으로 리터럴의 특정 위치 (이 경우 위치 4는 길이 4)를 검색 한 다음 출력 데이터 세트를 지정하면됩니다.

분명히 공간 매개 변수는 아마도 내가 사용했던 것과 다를 수 있지만 당신이 갈 수있을만큼 충분해야합니다!

+0

안녕 SaggingRufus! 나는 가치가 ABCD PQRS 등등다는 것을 모른다., – user218324

3

알려지지 않은 값으로 고정 된 위치를 기준으로 여러 파일로 분할하려는 경우 데이터를 정렬해야하고 (분할 할 필드에서) WHR = GROUP을 OUTREC에서 사용해야합니다 여러 개의 OUTFIL에서 INCLUDE 할 수있는 것이 있어야합니다.

//SYSIN DD * 
    SORT FIELDS=(6,4,CH,A) 
    OUTREC IFTHEN=(WHEN=GROUP, 
       KEYBEGIN=(6,4), 
       PUSH=(81:ID=2)) 

    OUTFIL INCLUDE=(81,2,CH,EQ,C'01'), 
     FNAMES=OUT1, 
     BUILD=(1,80) 
    OUTFIL INCLUDE=(81,2,CH,EQ,C'02'), 
     FNAMES=OUT2, 
     BUILD=(1,80) 
    OUTFIL SAVE, 
     FNAMES=OUTA, 
     BUILD=(1,80) 
//SORTIN DD * 
1234 ABCD 
3991 ABCD 
3818 ABCD 
1939 PQRS 
2838 PQRS 
1939 ABCD 
2819 PQRS 
2102 FILQ 
2911 ABCD 
3912 FILQ 

을 제공합니다 :

OUT1 
1234 ABCD 
1939 ABCD 
2911 ABCD 
3991 ABCD 
3818 ABCD 

OUT2 
3912 FILQ 
2102 FILQ 

OUTA 
1939 PQRS 
2819 PQRS 
2838 PQRS 

것은 내가 테스트를 위해 80 바이트의 고정 길이 레코드를 사용했습니다. 레코드 길이가 다른 경우 81로 모든 참조를 레코드 길이 + 길이로 변경하고 모든 참조를 레코드 길이로 80로 변경하십시오.

데이터가 가변 길이 레코드에있는 경우 이전에 언급 했어야합니다. 코드가 다릅니다.

WHEN = GROUP은 그룹을 정의하며 그룹 정의의 정보를 그룹의 모든 레코드에 적용 할 수 있습니다 (PUSH 사용). ID (그룹의 순번)와 SEQ (그룹의 순차 번호)의 두 가지 특수 필드를 사용할 수 있습니다. ID = 2는 그룹에 대한 두 자리 숫자 시퀀스 번호를 의미합니다. 이렇게하면 코드가 잘못되기 전에 최대 100 개의 그룹이 허용됩니다.

10 개의 OUTFIL이 있습니다 (세 개를 보여줍니다). 마지막 OUTFIL (나는 OUTA라고 불렀습니다)에 INCLUDE 대신 SAVE를 사용할 것을 제안합니다. SAVE는 "다른 OUTFIL에없는 모든 레코드가 여기에옵니다"를 의미합니다. 그룹이 10 개 이상이라도 적어도 100 개 그룹을 초과 할 때까지 모든 데이터를 보유하게됩니다.

PUSH는 모든 유형의 리터럴 값, 위에서 언급 한 특수 필드 및 그룹을 정의하는 레코드의 데이터 만 사용할 수 있다는 점을 제외하면 OVERLAY와 유사합니다.

이 PUSH는 레코드를 확장합니다. 이를 임시 확장자로 만들려면 각 OUTFIL의 BUILD가 각 레코드를 원래 크기로 리턴하십시오.

+0

빌 고맙습니다! – user218324