View previous topic :: View next topic
Author
Message
pawan_kch New User Joined: 05 Apr 2006Posts: 11 Location: Bangalore
Hi,
I have a comma delimted file which is copied to the mainframe flat file through other system,
lets says my input file is of LRECL 20 fixed length,
Code:
----+----1----+----2
********************
A,B,C,D,,E,F,G,H
A,B,C,D,E
A,B,C,D,E,F,G,H,I,J
I want to count the number of commas within a record and place the count towards the end of the file,
Output should be,
Code:
----+----1----+----2--
**********************
A,B,C,D,,E,F,G,H 08
A,B,C,D,E 04
A,B,C,D,E,F,G,H,I,J 09
For some reasons i want to omit the invalid records based on the delimter(,) count.
Lets say, the count of the comma within a record should be 8 for a valid record, here my first record is the valid one.
The other 2 records with comma count of 04 and 09 should fall into the invalid record file.
Can this be done using a SORT. Any ideas/code, please help me.
Back to top
Skolusu Senior Member Joined: 07 Dec 2007Posts: 2205 Location: San Jose
pawan_kch,
DFSORT does NOT have any built in features to count the characters. If your lrecl is 20 as you say ( it may be different in real), you can use a bunch of IFTHEN statements to validate each byte and then count the number of comma's. A Cobol E15/E35 is the right way to do it
What is the LRECL and RECFM of the input file ? Do you have any packed/binary fields in the input file or is the entire file a plain text file with characters A - Z and 0-9?
Back to top
pawan_kch New User Joined: 05 Apr 2006Posts: 11 Location: Bangalore
Hi, My input record length is 340, and the number of columns within a record is 29. Hence the count of commas should be 28 for the record to be valid.
No, my input file doesnt contain any packed/binary data.
do you have any pseudo code to present here? Thank You.
Back to top
Skolusu Senior Member Joined: 07 Dec 2007Posts: 2205 Location: San Jose
pawan_kch wrote:
Hi, My input record length is 340, and the number of columns within a record is 29. Hence the count of commas should be 28 for the record to be valid.
pawan_kch,
Since the comma's are less than 100, we can use parse feature to grab the comma's and count them. Use the following DFSORT JCL which will give you the desired results. I assumed a max of 30 comma's
Code:
//STEP0100 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=Your input FB 340 byte file,DISP=SHR
//VALID DD SYSOUT=*
//INVALID DD SYSOUT=*
//SYSIN DD *
OPTION COPY
INREC IFOUTLEN=342,IFTHEN=(WHEN=INIT,OVERLAY=(341:30X)),
IFTHEN=(WHEN=INIT,FINDREP=(INOUT=(C',,',C', ,'))),
IFTHEN=(WHEN=INIT,
PARSE=(%01=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%02=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%03=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%04=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%05=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%06=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%07=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%08=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%09=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%10=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%11=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%12=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%13=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%14=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%15=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%16=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%17=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%18=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%19=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%20=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%21=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%22=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%23=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%24=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%25=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%26=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%27=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%28=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%29=(ENDAT=C',',ADDPOS=1,FIXLEN=1),
%30=(ENDAT=C',',ADDPOS=1,FIXLEN=1)),
OVERLAY=(371:%01,%02,%03,%04,%05,%06,%07,%08,%09,%10,
%11,%12,%13,%14,%15,%16,%17,%18,%19,%20,
%21,%22,%23,%24,%25,%26,%27,%28,%29,%30)),
IFTHEN=(WHEN=INIT,FINDREP=(STARTPOS=371,INOUT=(C',',C'1'))),
IFTHEN=(WHEN=INIT,
OVERLAY=(341:(371,1,ZD,ADD,372,1,ZD,ADD,373,1,ZD,ADD,374,1,ZD,ADD,
375,1,ZD,ADD,376,1,ZD,ADD,377,1,ZD,ADD,378,1,ZD,ADD,
379,1,ZD,ADD,380,1,ZD,ADD,381,1,ZD,ADD,382,1,ZD,ADD,
383,1,ZD,ADD,384,1,ZD,ADD,385,1,ZD,ADD,386,1,ZD,ADD,
387,1,ZD,ADD,388,1,ZD,ADD,389,1,ZD,ADD,390,1,ZD,ADD,
391,1,ZD,ADD,392,1,ZD,ADD,393,1,ZD,ADD,394,1,ZD,ADD,
395,1,ZD,ADD,396,1,ZD,ADD,397,1,ZD,ADD,398,1,ZD,ADD,
399,1,ZD,ADD,400,1,ZD),EDIT=(TT)))
OUTFIL FNAMES=VALID,INCLUDE=(341,2,ZD,EQ,28)
OUTFIL FNAMES=INVALID,SAVE
//*
Back to top
Frank Yaeger DFSORT Developer Joined: 15 Feb 2005Posts: 7129 Location: San Jose, CA
If you want to put the records that have 28 commas in output file1 and the records that don't have 28 commas in output file2, you can use a DFSORT job like the following (there's no need to actually record the count in the record in order to create the two output files):
Code:
//S1 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=... input file1 (FB/340)
//GOOD DD DSN=... output file1 (FB/340)
//BAD DD DSN=... output file2 (FB/340)
//SYSIN DD *
OPTION COPY
INREC PARSE=(%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%=(STARTAT=C','),%=(STARTAT=C','),%=(STARTAT=C','),
%28=(STARTAT=C',',FIXLEN=1),
%29=(STARTAT=C',',FIXLEN=1)),
OVERLAY=(341:%28,%29)
OUTFIL FNAMES=GOOD,INCLUDE=(341,1,CH,EQ,C',',AND,342,1,CH,EQ,C' '),
BUILD=(1,340)
OUTFIL FNAMES=BAD,SAVE,BUILD=(1,340)
/*
For my testing I used this input:
Code:
,,,,,,,,,,,,,,,,,,,,,,,,,,,, GOOD1
,,,,,,,,,,,,,,,,,,,,,,,,,,, BAD1
,,,,,,,,,,,,,,,,,,,,,,,,,,,,, BAD2
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 GOOD2
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9, BAD3
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8 BAD4
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5 BAD5
,,,,,,,ABCDEFG,,,,,,,,,,XYZ,,,,,,,,,,, GOOD3
,,,,,,,ABCDEFG,,,,,,,,,,XYZ,,,,,,,,,,,, BAD6
,,,,,,,ABCDEFG,,,,,,,,,,XYZ,,,,,,,,,, BAD7
1,2,3,4 BAD8
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,,BAD9
and got this output:
GOOD:
Code:
,,,,,,,,,,,,,,,,,,,,,,,,,,,, GOOD1
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 GOOD2
,,,,,,,ABCDEFG,,,,,,,,,,XYZ,,,,,,,,,,, GOOD3
BAD
Code:
,,,,,,,,,,,,,,,,,,,,,,,,,,, BAD1
,,,,,,,,,,,,,,,,,,,,,,,,,,,,, BAD2
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9, BAD3
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8 BAD4
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5 BAD5
,,,,,,,ABCDEFG,,,,,,,,,,XYZ,,,,,,,,,,,, BAD6
,,,,,,,ABCDEFG,,,,,,,,,,XYZ,,,,,,,,,, BAD7
1,2,3,4 BAD8
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,,BAD9
Back to top
pawan_kch New User Joined: 05 Apr 2006Posts: 11 Location: Bangalore
Skolusu & Frank, Thanks very much for your ideas. very helpful.
Frank, This worked perfecly for me without actually counting the occurence of a string. This is great. Thanks much.
Back to top
Please enable JavaScript!