Parsing dates in a CSV format



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

Parsing dates in a CSV format

Postby MitchellSTL » Thu Feb 23, 2012 7:53 pm

Expanding on this topic http://www.ibmmainframeforum.com/dfsort-icetool-icegener/topic6335.html (which, btw, works wondeful - thanks!), I have a need to handle empty dates.

The main difference between then and now is that I do not have time in the field -- just a date -- and it's not a requirement that it will be populated. How can I handle an empty field in a date field?

This is what I tried:

//S1 EXEC PGM=SORT                                                              
//SYSOUT DD SYSOUT=*                                                            
//SORTIN DD *                                                                    
"D1","","","MOREDATA12345"                                                      
"DATA2","12/1/2010","","MOREDATA2"                                              
"DATA3","","8/5/2011","MOREDATA3"                                                
"DATA4","9/2/2008","11/15/2011","MOREDATA4"                                      
/*                                                                              
//SORTOUT DD SYSOUT=*                                                            
//SYSIN DD *                                                                    
   OPTION COPY                                                                  
   INREC PARSE=(%01=(ABSPOS=2,ENDBEFR=C'","',FIXLEN=10),                        
*                                                                                
     %02=(ENDBEFR=C'/',FIXLEN=2),                                                
     %03=(ENDBEFR=C'/',FIXLEN=2),                                                
     %04=(ENDBEFR=C'","',FIXLEN=4),                                              
*                                                                                
     %05=(ENDBEFR=C'/',FIXLEN=2),                                                
     %06=(ENDBEFR=C'/',FIXLEN=2),                                                
     %07=(ENDBEFR=C'","',FIXLEN=4),                                              
     %07=(ENDBEFR=C'","',FIXLEN=4),                                              
*                                                                                
     %08=(ENDBEFR=C'"',FIXLEN=10)),                                              
   BUILD=(%01,                                                                  
          %04,UFF,EDIT=(TTTT),                                                  
          C'/',                                                                  
          %02,UFF,EDIT=(TT),                                                    
          C'/',                                                                  
          %03,UFF,EDIT=(TT),                                                    
          %07,UFF,EDIT=(TTTT),                                                  
          C'/',                                                                  
          %05,UFF,EDIT=(TT),                                                    
          C'/',                                                                  
          %06,UFF,EDIT=(TT),
          %08)                                                                  
/*                                                                              
 


This is the output from the above

********************************* TOP OF DATA **********************************
D1        0000/00/000000/00/00                                                  
DATA2     2010/12/010000/00/00                                                  
DATA3     2011/00/050000/00/00                                                  
DATA4     2008/09/022011/11/15MOREDATA4                                        
******************************** BOTTOM OF DATA ********************************


This is what I was hoping for:

********************************* TOP OF DATA **********************************
D1        0000/00/000000/00/00MOREDATA12345
DATA2     2010/12/010000/00/00MOREDATA2
DATA3     0000/00/002011/08/05MOREDATA3
DATA4     2008/09/022011/11/15MOREDATA4
******************************** BOTTOM OF DATA ********************************
 
MitchellSTL
 
Posts: 27
Joined: Wed Feb 16, 2011 8:57 am
Has thanked: 1 time
Been thanked: 0 time

Re: Parsing dates in a CSV format

Postby skolusu » Thu Feb 23, 2012 11:19 pm

MitchellSTL,

If you are missing a field in between then you need to parse it differently like shown below.
//STEP0100 EXEC PGM=SORT                               
//SYSOUT   DD SYSOUT=*                                 
//SORTIN   DD *                                         
"D1","","","MOREDATA12345"                             
"DATA2","12/1/2010","","MOREDATA2"                     
"DATA3","","8/5/2011","MOREDATA3"                       
"DATA4","9/2/2008","11/15/2011","MOREDATA4"             
//SORTOUT  DD SYSOUT=*                                 
//SYSIN DD *                                           
   OPTION COPY                                         
   INREC IFTHEN=(WHEN=INIT,                             
          PARSE=(%01=(ABSPOS=2,ENDBEFR=C'",',FIXLEN=10),
                 %02=(ENDBEFR=C'",',FIXLEN=11),         
                 %03=(ENDBEFR=C'",',FIXLEN=11),         
                 %04=(ENDBEFR=C'" ',FIXLEN=31)),       
          BUILD=(%01,%02,%03,%04)),                     
                                                       
   IFTHEN=(WHEN=(11,11,SS,EQ,C'/'),                     
          PARSE=(%05=(ABSPOS=12,ENDBEFR=C'/',FIXLEN=2),
                 %06=(ENDBEFR=C'/',FIXLEN=2),           
                 %07=(FIXLEN=4)),                       
          OVERLAY=(12:%05,UFF,EDIT=(TT),C'/',           
                      %06,UFF,EDIT=(TT),C'/',           
                      %07,UFF,EDIT=(TTTT)),HIT=NEXT),   
                                                       
   IFTHEN=(WHEN=(23,11,SS,EQ,C'/'),                     
          PARSE=(%08=(ABSPOS=23,ENDBEFR=C'/',FIXLEN=2),
                 %09=(ENDBEFR=C'/',FIXLEN=2),           
                 %10=(FIXLEN=4)),                       
          OVERLAY=(23:%08,UFF,EDIT=(TT),C'/',           
                      %09,UFF,EDIT=(TT),C'/',           
                      %10,UFF,EDIT=(TTTT)),HIT=NEXT),   
                                                       
   IFTHEN=(WHEN=(12,10,CH,EQ,C' '),                     
        OVERLAY=(12:C'00/00/0000'),HIT=NEXT),           
   IFTHEN=(WHEN=(23,10,CH,EQ,C' '),                     
        OVERLAY=(23:C'00/00/0000'))                     
                                                       
   OUTREC FINDREP=(INOUT=(C'"',C''))                   
//*


The output of this is
D1        00/00/000000/00/0000MOREDATA12345
DATA2     12/01/201000/00/0000MOREDATA2     
DATA3     00/00/000008/05/2011MOREDATA3     
DATA4     09/02/200811/15/2011MOREDATA4     
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: Parsing dates in a CSV format

Postby MitchellSTL » Tue Feb 28, 2012 12:34 am

Sorry for not responding sooner -- I was going over your solution to make sure I understand it. It's definitely different than what I was thinking it would look like! Thanks!
MitchellSTL
 
Posts: 27
Joined: Wed Feb 16, 2011 8:57 am
Has thanked: 1 time
Been thanked: 0 time


Return to DFSORT/ICETOOL/ICEGENER

 


  • Related topics
    Replies
    Views
    Last post