Join record into a a record by a same key



IBM's flagship sort product DFSORT for sorting, merging, copying, data manipulation and reporting. Includes ICETOOL and ICEGENER

Join record into a a record by a same key

Postby javivi » Mon Feb 27, 2012 2:34 pm

Hi
I have a file where every record has 2 fields: a key and a value.
I need to generate a record by each key, joining the values. The problem is that I have 120 records by key and I don't know how I can do it.

The input file example is (pos 1 to 5 the key, pos 7 to 12 the value):

00123 000001
00123 000002
.
.
00123 000120
00455 000001
00455 000002
.
.
00455 000120
01856 000001
01856 000002
.
.
01856 000120

And I need to produce a file with:
00123 000001-000002-000003......000120
00455 000001-000002-000003......000120
.
.
01856 000001-000002-000003.......000120

Any Idea?

Thanks
javivi
 
Posts: 47
Joined: Fri Jan 21, 2011 2:53 pm
Has thanked: 0 time
Been thanked: 0 time

Re: Join record into a a record by a same key

Postby enrico-sorichetti » Mon Feb 27, 2012 4:49 pm

here is a snippet working for 5 values
 ****** ***************************** Top of Data ******************************
 000001 //ENRICO1  JOB NOTIFY=&SYSUID,                                         
 000002 //             MSGLEVEL=(1,1),CLASS=A,MSGCLASS=X                       
 000003 //*                                                                     
 000004 //ICE     EXEC PGM=ICETOOL                                             
 000005 //TOOLMSG   DD SYSOUT=*                                                 
 000006 //DFSMSG    DD SYSOUT=*                                                 
 000007 //TMP       DD DISP=(MOD,PASS),                                         
 000008 //             UNIT=SYSDA,SPACE=(CYL,(8,8))                             
 000009 //IN1       DD *                                                       
 000010 12345 000001                                                           
 000011 12345 000002                                                           
 000012 12345 000003                                                           
 000013 12345 000004                                                           
 000014 12345 000005                                                           
 000015 23456 000001                                                           
 000016 23456 000002                                                           
 000017 23456 000003                                                           
 000018 23456 000004                                                           
 000019 23456 000005                                                           
 000020 34567 000001                                                           
 000021 34567 000002                                                           
 000022 34567 000003                                                           
 000023 34567 000004                                                           
 000024 34567 000005                                                           
 000025 //OUT       DD SYSOUT=*                                                 
 000026 //TOOLIN    DD *                                                       
 000027   SORT   FROM(IN1) TO(TMP) USING(CTL1)                                 
 000028   SPLICE FROM(TMP) TO(OUT) ON(1,5,CH) WITHANY -                         
 000029          WITH(006,7) -                                                 
 000030          WITH(013,7) -                                                 
 000031          WITH(020,7) -                                                 
 000032          WITH(027,7) -                                                 
 000033          WITH(034,7)                                                   
 000034 //CTL1CNTL DD *                                                         
 000035   SORT FIELDS=(1,5,CH,A,7,6,CH,A)                                       
 000036   OUTREC IFTHEN=(WHEN=INIT,OVERLAY=(81:SEQNUM,3,ZD,RESTART=(01,5))),   
 000037   IFTHEN=(WHEN=(81,3,ZD,EQ,01),BUILD=(1,5,006:C'-',7,6)),               
 000038   IFTHEN=(WHEN=(81,3,ZD,EQ,02),BUILD=(1,5,013:C'-',7,6)),               
 000039   IFTHEN=(WHEN=(81,3,ZD,EQ,03),BUILD=(1,5,020:C'-',7,6)),               
 000040   IFTHEN=(WHEN=(81,3,ZD,EQ,04),BUILD=(1,5,027:C'-',7,6)),               
 000041   IFTHEN=(WHEN=(81,3,ZD,EQ,05),BUILD=(1,5,034:C'-',7,6))               
 000042 //*                                                                     
 ****** **************************** Bottom of Data ****************************


********************************* TOP OF DATA **********************************
12345-000001-000002-000003-000004-000005                                       
23456-000001-000002-000003-000004-000005                                       
34567-000001-000002-000003-000004-000005                                       
******************************** BOTTOM OF DATA ********************************


it should not be too difficult to add as many WITHs and IFTHENs to match Your requirement
and do not forget to change also the sequence number position ...
should somewhere around 5 + ( 120 * 7 ) + 1
cheers
enrico
When I tell somebody to RTFM or STFW I usually have the page open in another tab/window of my browser,
so that I am sure that the information requested can be reached with a very small effort
enrico-sorichetti
Global moderator
 
Posts: 2994
Joined: Fri Apr 18, 2008 11:25 pm
Has thanked: 0 time
Been thanked: 164 times

Re: Join record into a a record by a same key

Postby javivi » Mon Feb 27, 2012 5:51 pm

Thanks Enrico but the problem is that I nead at least 120 WITH and the dfsort limit for WITH is 50.

Any Idea?
javivi
 
Posts: 47
Joined: Fri Jan 21, 2011 2:53 pm
Has thanked: 0 time
Been thanked: 0 time

Re: Join record into a a record by a same key

Postby enrico-sorichetti » Mon Feb 27, 2012 7:36 pm

split into two stages ...
1) splice to get 3 records with 50 values each
2) REsplice with the 350 bytes

here is the snippet for 12 values
should not be difficult to recalculate the offsets and chunks for 120 values

 ****** ***************************** Top of Data ******************************
 000001 //ENRICO1  JOB NOTIFY=&SYSUID,                                         
 000002 //             MSGLEVEL=(1,1),CLASS=A,MSGCLASS=X                       
 000003 //*                                                                     
 000004 //AMS     EXEC PGM=IDCAMS                                               
 000005 //SYSPRINT  DD SYSOUT=*                                                 
 000006 //SYSIN     DD *                                                       
 000007   DELETE ENRICO.SORT.TMP                                               
 000008   DELETE ENRICO.SORT.TMP2                                               
 000009   DELETE ENRICO.SORT.TMP3                                               
 000010   SET LASTCC=0                                                         
 000011   SET MAXCC=0                                                           
 000012 //*                                                                     
 000013 //ICE     EXEC PGM=ICETOOL                                             
 000014 //TOOLMSG   DD SYSOUT=*                                                 
 000015 //DFSMSG    DD SYSOUT=*                                                 
 000016 //TMP       DD DISP=(MOD,CATLG),                                       
 000017 //             DSN=ENRICO.SORT.TMP,                                     
 000018 //             UNIT=SYSDA,SPACE=(CYL,(8,8))                             
 000019 //TMP2      DD DISP=(MOD,CATLG),                                       
 000020 //             DSN=ENRICO.SORT.TMP2,                                   
 000021 //             UNIT=SYSDA,SPACE=(CYL,(8,8))                             
 000022 //TMP3      DD DISP=(MOD,CATLG),                                       
 000023 //             DSN=ENRICO.SORT.TMP3,                                   
 000024 //             UNIT=SYSDA,SPACE=(CYL,(8,8))                             
 000025 //IN1       DD *                                                       
 000026 12345 000001                                                           
 000027 12345 000002                                                           
 000028 12345 000003                                                           
 000029 12345 000004                                                           
 000030 12345 000005                                                           
 000031 12345 000006                                                           
 000032 12345 000007                                                           
 000033 12345 000008                                                           
 000034 12345 000009                                                           
 000035 12345 000010                                                           
 000036 12345 000011                                                           
 000037 12345 000012                                                           
 000038 23456 000001                                                           
 000039 23456 000002                                                           
 000040 23456 000003                                                           
 000041 23456 000004                                                           
 000042 23456 000005                                                           
 000043 23456 000006                                                           
 000044 23456 000007                                                           
 000045 23456 000008                                                           
 000046 23456 000009                                                           
 000047 23456 000010                                                           
 000048 23456 000011                                                           
 000049 23456 000012                                                           
 000050 //OUT       DD SYSOUT=*                                                 
 000051 //TOOLIN    DD *                                                       
 000052   SORT   FROM(IN1)  TO(TMP) USING(CTL1)                                 
 000053   SPLICE FROM(TMP)  TO(TMP2) ON(1,5,CH) ON(81,1,CH) WITHANY -           
 000054          WITH(006,7) WITH(013,7) WITH(020,7) WITH(027,7) WITH(034,7)   
 000055   COPY   FROM(TMP2) TO(TMP3) USING(CTL2)                               
 000056   SPLICE FROM(TMP3) TO(OUT) ON(1,5,CH) WITHANY -                       
 000057          WITH(006,35) WITH(041,35) WITH(076,35)                         
 000058 //CTL1CNTL DD *                                                         
 000059   SORT FIELDS=(1,5,CH,A,7,6,CH,A)                                       
 000060   OUTREC IFTHEN=(WHEN=INIT,OVERLAY=(81:SEQNUM,5,ZD,RESTART=(01,5))),   
 000061   IFTHEN=(WHEN=(81,5,ZD,EQ,01),BUILD=(1,5,006:C'-',7,6,81:C'1')),       
 000062   IFTHEN=(WHEN=(81,5,ZD,EQ,02),BUILD=(1,5,013:C'-',7,6,81:C'1')),       
 000063   IFTHEN=(WHEN=(81,5,ZD,EQ,03),BUILD=(1,5,020:C'-',7,6,81:C'1')),       
 000064   IFTHEN=(WHEN=(81,5,ZD,EQ,04),BUILD=(1,5,027:C'-',7,6,81:C'1')),       
 000065   IFTHEN=(WHEN=(81,5,ZD,EQ,05),BUILD=(1,5,034:C'-',7,6,81:C'1')),       
 000066   IFTHEN=(WHEN=(81,5,ZD,EQ,06),BUILD=(1,5,006:C'-',7,6,81:C'2')),       
 000067   IFTHEN=(WHEN=(81,5,ZD,EQ,07),BUILD=(1,5,013:C'-',7,6,81:C'2')),       
 000068   IFTHEN=(WHEN=(81,5,ZD,EQ,08),BUILD=(1,5,020:C'-',7,6,81:C'2')),       
 000069   IFTHEN=(WHEN=(81,5,ZD,EQ,09),BUILD=(1,5,027:C'-',7,6,81:C'2')),       
 000070   IFTHEN=(WHEN=(81,5,ZD,EQ,10),BUILD=(1,5,034:C'-',7,6,81:C'2')),       
 000071   IFTHEN=(WHEN=(81,5,ZD,EQ,11),BUILD=(1,5,006:C'-',7,6,81:C'3')),       
 000072   IFTHEN=(WHEN=(81,5,ZD,EQ,12),BUILD=(1,5,013:C'-',7,6,81:C'3'))       
 000073 //CTL2CNTL DD *                                                         
 000074   OPTION COPY                                                           
 000075   OUTREC IFTHEN=(WHEN=INIT,OVERLAY=(81:SEQNUM,5,ZD,RESTART=(01,5))),   
 000076   IFTHEN=(WHEN=(81,5,ZD,EQ,01),BUILD=(1,5,006:006,35)),                 
 000077   IFTHEN=(WHEN=(81,5,ZD,EQ,02),BUILD=(1,5,041:006,35)),                 
 000078   IFTHEN=(WHEN=(81,5,ZD,EQ,03),BUILD=(1,5,076:006,35))                 
 000079 //*                                                                     
 ****** **************************** Bottom of Data ****************************                                                                 


*************************************************************** TOP OF DATA **********************************
12345-000001-000002-000003-000004-000005-000006-000007-000008-000009-000010-000011-000012                     
23456-000001-000002-000003-000004-000005-000006-000007-000008-000009-000010-000011-000012                     
************************************************************** BOTTOM OF DATA ********************************
cheers
enrico
When I tell somebody to RTFM or STFW I usually have the page open in another tab/window of my browser,
so that I am sure that the information requested can be reached with a very small effort
enrico-sorichetti
Global moderator
 
Posts: 2994
Joined: Fri Apr 18, 2008 11:25 pm
Has thanked: 0 time
Been thanked: 164 times

Re: Join record into a a record by a same key

Postby skolusu » Mon Feb 27, 2012 10:30 pm

Assuming that you always have 120 records per key and data is already sorted on the key, the following DFSORT/ICETOOL JCL will give you the desired results

You have 120 key values to be arranged as a single record each delimited with '-' and 5 byte key with a space between. So the total output lrecl is (5 bytes key + space + (120*7)=846 bytes

//STEP0100 EXEC PGM=ICETOOL                                   
//TOOLMSG  DD SYSOUT=*                                         
//DFSMSG   DD SYSOUT=*                                         
//IN       DD DSN=Your input file,DISP=SHR                               
//OUT      DD SYSOUT=*                                         
//TOOLIN   DD *                                               
  RESIZE FROM(IN) TO(OUT) TOLEN(1440) USING(CTL1)             
//CTL1CNTL DD *                                               
  INREC IFOUTLEN=12,IFTHEN=(WHEN=INIT,BUILD=(1,12)),           
  IFTHEN=(WHEN=GROUP,KEYBEGIN=(1,5),PUSH=(13:SEQ=3)),         
  IFTHEN=(WHEN=(13,3,ZD,GT,1),OVERLAY=(5X,C'-'))               
  SORT FIELDS=COPY                                             
  OUTFIL IFOUTLEN=846,                                         
  IFTHEN=(WHEN=INIT,OVERLAY=(13:13,1428,SQZ=(SHIFT=(LEFT))))   
//*
Kolusu - DFSORT Development Team (IBM)
DFSORT is on the Web at:
www.ibm.com/storage/dfsort
skolusu
 
Posts: 586
Joined: Wed Apr 02, 2008 10:38 pm
Has thanked: 0 time
Been thanked: 39 times

Re: Join record into a a record by a same key

Postby enrico-sorichetti » Mon Feb 27, 2012 11:03 pm

:oops:
I sit corrected ( more comfortable than standing ) ;)
PS. when somebody has the habit of cloning existing working solutions it is quite easy to forget about the new features !
cheers
enrico
When I tell somebody to RTFM or STFW I usually have the page open in another tab/window of my browser,
so that I am sure that the information requested can be reached with a very small effort
enrico-sorichetti
Global moderator
 
Posts: 2994
Joined: Fri Apr 18, 2008 11:25 pm
Has thanked: 0 time
Been thanked: 164 times


Return to DFSORT/ICETOOL/ICEGENER

 


  • Related topics
    Replies
    Views
    Last post