MVSFORUMS.com A Community of and for MVS Professionals
View previous topic :: View next topic
Author
Message
naveen_kj Beginner Joined: 03 Feb 2003 Posts: 18 Topics: 8 Location: India
Posted: Thu Aug 21, 2003 10:52 am Post subject: Disposition of records
Hi,
I have a file which contains a fixed length of 4 bytes as key field. The starting position is from 1st, 2nd, 3rd and so on... I do not know the exact starting position of the field in the input file.
input file
XXXX
two spaces and YYYY
AAAA
three spaces and BBBBB
one space and CCCC
output file as,
XXXX
YYYY
AAAA
BBBB
CCCC
Can this be done by using sort.
Thanks,
Naveen
Back to top
coolman Intermediate Joined: 03 Jan 2003 Posts: 283 Topics: 27 Location: US
Posted: Fri Aug 22, 2003 1:16 am Post subject:
Naveen,
What is the maximum number of spaces that is possible after which the first valid character of the record will start.
Cheers,
Coolman.
________
honey oil Last edited by coolman on Sat Feb 05, 2011 1:26 am; edited 1 time in total
Back to top
naveen_kj Beginner Joined: 03 Feb 2003 Posts: 18 Topics: 8 Location: India
Posted: Fri Aug 22, 2003 6:29 am Post subject:
Coolman,
The maximum number of spaces is 10.
Naveen
Back to top
coolman Intermediate Joined: 03 Jan 2003 Posts: 283 Topics: 27 Location: US
Posted: Fri Aug 22, 2003 8:31 am Post subject:
Naveen,
The following job should give you the results...
Code:
//STEP1 EXEC PGM=ICETOOL
//IN DD *
AAAAAAAAAA
AAAAAAAAAA
BBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDD
EEEEEEEEEEEEEE
FFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJ
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//OUT DD SYSOUT=*
//T0 DD DSN=&T0,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T1 DD DSN=&T1,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T2 DD DSN=&T2,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T3 DD DSN=&T3,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T4 DD DSN=&T4,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T5 DD DSN=&T5,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T6 DD DSN=&T6,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T7 DD DSN=&T7,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T8 DD DSN=&T8,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T9 DD DSN=&T9,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//T10 DD DSN=&T10,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//TE DD DSN=&TE,UNIT=SYSDA,SPACE=(TRK,(1,1)),DISP=(,PASS)
//CON DD DSN=*.T0,VOL=REF=*.T0,DISP=(SHR,PASS)
// DD DSN=*.T1,VOL=REF=*.T1,DISP=(SHR,PASS)
// DD DSN=*.T2,VOL=REF=*.T2,DISP=(SHR,PASS)
// DD DSN=*.T3,VOL=REF=*.T3,DISP=(SHR,PASS)
// DD DSN=*.T4,VOL=REF=*.T4,DISP=(SHR,PASS)
// DD DSN=*.T5,VOL=REF=*.T5,DISP=(SHR,PASS)
// DD DSN=*.T6,VOL=REF=*.T6,DISP=(SHR,PASS)
// DD DSN=*.T7,VOL=REF=*.T7,DISP=(SHR,PASS)
// DD DSN=*.T8,VOL=REF=*.T8,DISP=(SHR,PASS)
// DD DSN=*.T9,VOL=REF=*.T9,DISP=(SHR,PASS)
// DD DSN=*.T10,VOL=REF=*.T10,DISP=(SHR,PASS)
//TOOLIN DD *
COPY FROM(IN) USING(CTL0)
COPY FROM(TE) USING(CTL1)
COPY FROM(TE) USING(CTL2)
COPY FROM(TE) USING(CTL3)
COPY FROM(TE) USING(CTL4)
COPY FROM(TE) USING(CTL5)
COPY FROM(TE) USING(CTL6)
COPY FROM(TE) USING(CTL7)
COPY FROM(TE) USING(CTL8)
COPY FROM(TE) USING(CTL9)
COPY FROM(CON) TO(OUT)
/*
//CTL0CNTL DD *
OUTFIL FNAMES=T0,INCLUDE=(1,1,CH,NE,C' ')
OUTFIL SAVE,FNAMES=TE
/*
//CTL1CNTL DD *
OUTFIL FNAMES=T1,INCLUDE=(2,1,CH,NE,C' '),
OUTREC=(2,25,80:X)
OUTFIL SAVE,FNAMES=TE
/*
//CTL2CNTL DD *
OUTFIL FNAMES=T2,INCLUDE=(3,1,CH,NE,C' '),
OUTREC=(3,25,80:X)
OUTFIL SAVE,FNAMES=TE
/*
//CTL3CNTL DD *
OUTFIL FNAMES=T3,INCLUDE=(4,1,CH,NE,C' '),
OUTREC=(4,25,80:X)
OUTFIL SAVE,FNAMES=TE
/*
//CTL4CNTL DD *
OUTFIL FNAMES=T4,INCLUDE=(5,1,CH,NE,C' '),
OUTREC=(5,25,80:X)
OUTFIL SAVE,FNAMES=TE
/*
//CTL5CNTL DD *
OUTFIL FNAMES=T5,INCLUDE=(6,1,CH,NE,C' '),
OUTREC=(6,25,80:X)
OUTFIL SAVE,FNAMES=TE
/*
//CTL6CNTL DD *
OUTFIL FNAMES=T6,INCLUDE=(7,1,CH,NE,C' '),
OUTREC=(7,25,80:X)
OUTFIL SAVE,FNAMES=TE
/*
//CTL7CNTL DD *
OUTFIL FNAMES=T7,INCLUDE=(8,1,CH,NE,C' '),
OUTREC=(8,25,80:X)
OUTFIL SAVE,FNAMES=TE
/*
//CTL8CNTL DD *
OUTFIL FNAMES=T8,INCLUDE=(9,1,CH,NE,C' '),
OUTREC=(9,25,80:X)
OUTFIL SAVE,FNAMES=TE
/*
//CTL9CNTL DD *
OUTFIL FNAMES=T9,INCLUDE=(10,1,CH,NE,C' '),
OUTREC=(10,25,80:X)
OUTFIL SAVE,FNAMES=T10,OUTREC=(11,25,80:X)
/*
An alternative would to be go in for a REXX solution which would be the easiest.
Code:
/* REXX - SPN */
"ALLOC FI(INPUT) DA('YOUR.INPUT') SHR REUSE"
"ALLOC FI(OUTPUT) DA('YOUR.OUTPUT') SHR REUSE"
"EXECIO * DISKR INPUT(STEM IN. FINIS "
DO I = 1 TO IN.0
IN.I = SPACE(IN.I,0)
END
"EXECIO * DISKW OUTPUT(STEM IN. FINIS "
"FREE FI(INPUT,OUTPUT)"
EXIT
Hope this helps...
Cheers,
Coolman.
________
silver surfer vaporizer Last edited by coolman on Sat Feb 05, 2011 1:26 am; edited 1 time in total
Back to top
kolusu Site Admin Joined: 26 Nov 2002 Posts: 12367 Topics: 75 Location: San Jose
Posted: Fri Aug 22, 2003 9:33 am Post subject:
Naveen,
A simpler verison than what coolman posted.The following DFSORT/ICETOOL JCl will give you desired results.A brief explanation of the job.I assummed that your input file is 80 bytes in length and FB recfm.
We first take your input file and split it into 10 files based on no: of spaces for each record while adding a seqnum. This seqnum will be used for putting the records back in order.
The second sort takes in all the 10 files created above and sorts on the seqnum and stripps the seqnum
Code:
//STEP0100 EXEC PGM=ICETOOL
//*
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN DD *
AAAA
BBBB
CCCC
DDDD
EEEE
FFFF
GGGG
HHHH
IIII
JJJJ
KKKKK
//T0 DD DSN=&T0,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T1 DD DSN=&T1,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T2 DD DSN=&T2,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T3 DD DSN=&T3,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T4 DD DSN=&T4,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T5 DD DSN=&T5,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T6 DD DSN=&T6,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T7 DD DSN=&T7,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T8 DD DSN=&T8,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//T9 DD DSN=&T9,DISP=(,PASS),SPACE=(CYL,(1,1),RLSE)
//CON DD DSN=&T0,DISP=(OLD,PASS),VOL=REF=*.T0
// DD DSN=&T1,DISP=(OLD,PASS),VOL=REF=*.T1
// DD DSN=&T2,DISP=(OLD,PASS),VOL=REF=*.T2
// DD DSN=&T3,DISP=(OLD,PASS),VOL=REF=*.T3
// DD DSN=&T4,DISP=(OLD,PASS),VOL=REF=*.T4
// DD DSN=&T5,DISP=(OLD,PASS),VOL=REF=*.T5
// DD DSN=&T6,DISP=(OLD,PASS),VOL=REF=*.T6
// DD DSN=&T7,DISP=(OLD,PASS),VOL=REF=*.T7
// DD DSN=&T8,DISP=(OLD,PASS),VOL=REF=*.T8
// DD DSN=&T9,DISP=(OLD,PASS),VOL=REF=*.T9
//OUT DD SYSOUT=*
//TOOLIN DD *
COPY FROM(IN) USING(CTL1)
SORT FROM(CON) USING(CTL2)
//CTL1CNTL DD *
INREC FIELDS=(1,80,SEQNUM,8,ZD)
OUTFIL FNAMES=T0,INCLUDE=(1,10,CH,EQ,C' '),
OUTREC=(11,70,80:X,81,8)
OUTFIL FNAMES=T1,INCLUDE=(1,9,CH,EQ,C' ',AND,10,1,CH,NE,C' '),
OUTREC=(10,71,80:X,81,8)
OUTFIL FNAMES=T2,INCLUDE=(1,8,CH,EQ,C' ',AND,9,1,CH,NE,C' '),
OUTREC=(09,72,80:X,81,8)
OUTFIL FNAMES=T3,INCLUDE=(1,7,CH,EQ,C' ',AND,8,1,CH,NE,C' '),
OUTREC=(08,73,80:X,81,8)
OUTFIL FNAMES=T4,INCLUDE=(1,6,CH,EQ,C' ',AND,7,1,CH,NE,C' '),
OUTREC=(07,74,80:X,81,8)
OUTFIL FNAMES=T5,INCLUDE=(1,5,CH,EQ,C' ',AND,6,1,CH,NE,C' '),
OUTREC=(06,75,80:X,81,8)
OUTFIL FNAMES=T6,INCLUDE=(1,4,CH,EQ,C' ',AND,5,1,CH,NE,C' '),
OUTREC=(05,76,80:X,81,8)
OUTFIL FNAMES=T7,INCLUDE=(1,3,CH,EQ,C' ',AND,4,1,CH,NE,C' '),
OUTREC=(04,77,80:X,81,8)
OUTFIL FNAMES=T8,INCLUDE=(1,2,CH,EQ,C' ',AND,3,1,CH,NE,C' '),
OUTREC=(03,78,80:X,81,8)
OUTFIL FNAMES=T9,INCLUDE=(1,1,CH,EQ,C' ',AND,2,1,CH,NE,C' '),
OUTREC=(02,79,80:X,81,8)
//CTL2CNTL DD *
SORT FIELDS=(81,8,ZD,A)
OUTFIL FNAMES=OUT,OUTREC=(1,80)
/*
Hope this helps...
cheers
kolusu
Back to top
kolusu Site Admin Joined: 26 Nov 2002 Posts: 12367 Topics: 75 Location: San Jose
Posted: Fri Aug 22, 2003 10:17 am Post subject:
Naveen,
If your shop has easytrieve then the following JCL will give you desired results.
Code:
//STEP0100 EXEC PGM=EZTPA00
//STEPLIB DD DSN=CORP.EASYTREV.PROD.LOADLIB,
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSSNAP DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//FILEIN DD *
AAAA
BBBB
CCCC
DDDD
EEEE
FFFF
GGGG
HHHH
IIII
JJJJ
KKKK
//FILEOUT DD SYSOUT=*,
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0
//SYSIN DD *
FILE FILEIN
IN-REC 01 80 A
W-STRING W 80 A
W-STR W-STRING 1 A OCCURS 80
W-SUB W 02 N
W-END-POS W 02 N
W-CHAR-FOUND W 01 A
FILE FILEOUT FB(0 0)
OUT-REC 01 80 A
JOB INPUT FILEIN
W-STRING = IN-REC
MOVE SPACES TO OUT-REC
MOVE SPACES TO W-CHAR-FOUND
W-SUB = 1
DO UNTIL W-SUB GT 11 OR W-CHAR-FOUND = 'Y'
CASE W-STR (W-SUB)
WHEN ' '
W-SUB = W-SUB + 1
OTHERWISE
W-CHAR-FOUND = 'Y'
W-END-POS = FILEIN:RECORD-LENGTH - W-SUB
MOVE W-STR (W-SUB) W-END-POS TO OUT-REC
END-CASE
END-DO
PUT FILEOUT
/*
Hope this helps...
cheers
kolusu
Back to top
naveen_kj Beginner Joined: 03 Feb 2003 Posts: 18 Topics: 8 Location: India
Posted: Sat Aug 23, 2003 4:10 am Post subject:
Kolusu/Coolman,
Thanks for the solutions. I got the expected results.
Naveen
Back to top
Frank Yaeger Sort Forum Moderator Joined: 02 Dec 2002 Posts: 1618 Topics: 31 Location: San Jose
Posted: Thu May 18, 2006 4:25 pm Post subject:
With z/OS DFSORT V1R5 PTF UK90007 or DFSORT R14 PTF UK90006 (April, 2006), you can use DFSORT's new JFY function to do this kind of thing quite easily as shown by this DFSORT job.
Code:
//S1 EXEC PGM=ICEMAN
//SYSOUT DD SYSOUT=*
//SORTIN DD *
AAAA
BBBB
CCCC
DDDD
EEEE
FFFF
GGGG
HHHH
IIII
JJJJ
KKKKK
/*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
* Left-justify the characters.
INREC BUILD=(1,80,JFY=(SHIFT=LEFT))
/*
For complete details on all of the new DFSORT and ICETOOL functions available with the April, 2006 PTFs, see:
http://www.ibm.com/servers/storage/s...sort/mvs/peug/ _________________ Frank Yaeger - DFSORT Development Team (IBM)
Specialties: JOINKEYS, FINDREP, WHEN=GROUP, ICETOOL, Symbols, Migration
DFSORT is on the Web at:
www.ibm.com/storage/dfsort
Back to top
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum