Search position of a string

In this Mainframe Forum - You can post your queries on DFSORT, ICETOOL , SyncSort & JCL Utilities

Moderators: Frank Yaeger, Moderator Group

Post Reply
jathampy
Member
Posts: 22
Joined: Sat Sep 26, 2009 4:02 pm
Location: software engineer

Search position of a string

Post by jathampy » Wed Jan 27, 2010 11:45 pm

My requirement is to get the first starting position of a string (ZZZ) if it's found in a record. Similar to POS function used in REXX.
I used the following jcl and getting the correct results.
I feel the Sort JCL I used can be simplified to achieve the results in a better way. Appreciate if someone can help me to simplify the sort.

Also I would like to know is there any way to replace all non-blanks character value with 0 other than using ALTSEQ. I am not sure whether FINDREP can be used to replace all non-blank characters with 0 in a simple way rather than specifying each non-blank character in the INOUT list.

Code: Select all

//STEP018   EXEC PGM=SORT                                               
//SYSOUT    DD SYSOUT=*                                                 
//SORTIN    DD *                                                        
AA1BB2CC2DD3EE4FF5ZZZYY2                                                
DE2XB3ZZZMM4D13MESKLMJKG                                                
HGFZZZUIYHMNOJYUAABBCRTM                                                
GHHHHHHHHUUUUUULLLMZHHHZ                                                
//*                                                                     
//SORTOUT   DD SYSOUT=*                                                 
//SYSIN  DD *                                                           
  OPTION COPY                                                           
  ALTSEQ CODE=(C1F1,C2F1,C3F1,C4F1,C5F1,C6F1,C7F1,C8F1,C9F1,            
               D1F1,D2F1,D3F1,D4F1,D5F1,D6F1,D7F1,D8F1,D9F1,            
               E2F1,E3F1,E4F1,E5F1,E6F1,E7F1,E8F1,E9F1,F0F1,            
               F2F1,F3F1,F4F1,F5F1,F6F1,F7F1,F8F1,F9F1,40F0,E9F1)       
  INREC IFTHEN=(WHEN=INIT,                                              
                PARSE=(%01=(ENDBEFR=C'ZZZ',FIXLEN=25),                  
                       %02=(SUBPOS=3,FIXLEN=25)),                       
                BUILD=(%01,TRAN=ALTSEQ,%01,%02))                        
  OUTFIL IFTHEN=(WHEN=(26,50,SS,EQ,C'ZZZ'),                             
                BUILD=(26,50,SQZ=(SHIFT=LEFT,PREBLANK=C' '),C',',     
     1,1,FS,ADD,2,1,FS,ADD,3,1,FS,ADD,4,1,FS,ADD,5,1,FS,ADD,         
     6,1,FS,ADD,7,1,FS,ADD,8,1,FS,ADD,9,1,FS,ADD,10,1,FS,ADD,        
     11,1,FS,ADD,12,1,FS,ADD,13,1,FS,ADD,14,1,FS,ADD,15,1,FS,ADD,    
     16,1,FS,ADD,17,1,FS,ADD,18,1,FS,ADD,19,1,FS,ADD,20,1,FS,ADD,    
     21,1,FS,ADD,22,1,FS,ADD,23,1,FS,ADD,24,1,FS,ADD,25,1,FS,        
     ADD,+1,                                                         
     TO=FS,LENGTH=3,80:X)),                                          
         IFTHEN=(WHEN=NONE,                                          
                BUILD=(26,50,SQZ=(SHIFT=LEFT,PREBLANK=C' '),C',',    
              +0,TO=FS,LENGTH=3,80:X))                               
Output :

Code: Select all

AA1BB2CC2DD3EE4FF5ZZZYY2                          ,+19      
DE2XB3ZZZMM4D13MESKLMJKG                          , +7      
HGFZZZUIYHMNOJYUAABBCRTM                          , +4      
GHHHHHHHHUUUUUULLLMZHHHZ                          ,  0

User avatar
Frank Yaeger
Moderator
Posts: 812
Joined: Sat Feb 18, 2006 5:45 am
Location: San Jose, CA
Contact:

Post by Frank Yaeger » Thu Jan 28, 2010 1:27 am

Well, that's an interesting approach and I could probably improve on it, but really I'd suggest using these DFSORT control statements for a more straightforward and reliable approach:

Code: Select all

  OPTION COPY
  INREC IFOUTLEN=80,
   IFTHEN=(WHEN=INIT,OVERLAY=(51:C',  0')),
   IFTHEN=(WHEN=(1,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 1')),
   IFTHEN=(WHEN=(2,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 2')),
   IFTHEN=(WHEN=(3,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 3')),
   IFTHEN=(WHEN=(4,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 4')),
   IFTHEN=(WHEN=(5,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 5')),
   IFTHEN=(WHEN=(6,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 6')),
   IFTHEN=(WHEN=(7,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 7')),
   IFTHEN=(WHEN=(8,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 8')),
   IFTHEN=(WHEN=(9,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C' 9')),
   IFTHEN=(WHEN=(10,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'10')),
   IFTHEN=(WHEN=(11,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'11')),
   IFTHEN=(WHEN=(12,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'12')),
   IFTHEN=(WHEN=(13,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'13')),
   IFTHEN=(WHEN=(14,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'14')),
   IFTHEN=(WHEN=(15,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'15')),
   IFTHEN=(WHEN=(16,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'16')),
   IFTHEN=(WHEN=(17,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'17')),
   IFTHEN=(WHEN=(18,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'18')),
   IFTHEN=(WHEN=(19,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'19')),
   IFTHEN=(WHEN=(20,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'20')),
   IFTHEN=(WHEN=(21,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'21')),
   IFTHEN=(WHEN=(22,3,CH,EQ,C'ZZZ'),OVERLAY=(53:C'22'))

I am not sure whether FINDREP can be used to replace all non-blank characters with 0 in a simple way rather than specifying each non-blank character in the INOUT list.
No, it can't.
Frank Yaeger - DFSORT Development Team (IBM) - yaeger@us.ibm.com
Specialties: JOINKEYS, FINDREP, WHEN=GROUP, ICETOOL, Symbols, Migration
=> DFSORT/MVS is on the Web at http://www.ibm.com/storage/dfsort

Post Reply

FREE TUTORIALS

Tutorials
Free tutorials from mainframegurukul
  • JCL Tutorial
    Covers all important JCL concepts.
  • Cobol Tutorial
    This tutorials covers all Cobol Topics from STRING to COMP-3.
  • DB2 Tutorial
    DB2 Tutorial focuses on DB2 COBOL Programming.
  • SORT Tutorial
    This Tutorial covers all important aspects of DFSORT with examples
  • CICS Tutorial
    This CICS tutorial covers CICS concepts and CICS Basics, CICS COBOL Programming.
Interview
Mainframe Interview questions



Other References
Mainframe Tools and others