combine 2 lines in one with dfsort?



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

combine 2 lines in one with dfsort?

Postby lostcontinent » Thu Jan 20, 2011 1:30 pm

hello again,

I have a big file with database content, so that variables containing binary fields are displayed in a "readable" hex-form:

             01E4       
VAR1     =  '069B'     
VAR1234  =  'G'         
XYZ      =  '0674'     
*PADDING =  ' '         
             0E         
VAR2345  =  '37'       


Is it possible to manipulate this output with sort to get the 2 lines containing the hex-code in 1 line in decimal?
In the above example:
VAR1 is '0016E94B'h, so it should be printed out as 1501515 (decimal)
VAR2345 is '03E7'h, so it should be printed out as 999 (decimal)

OR

Is it possible to get/keep the the content of the previous sort line?

frank
lostcontinent
 
Posts: 13
Joined: Tue Jul 27, 2010 1:47 pm
Has thanked: 0 time
Been thanked: 0 time

Re: combine 2 lines in one with dfsort?

 

Re: combine 2 lines in one with dfsort?

Postby Frank Yaeger » Thu Jan 20, 2011 11:39 pm

I'm not sure you covered all the possible variations for your input records, but assuming that you did, here's a DFSORT job that will extract the two line variables and display them in the way I think you asked for. Note that you'll need z/OS DFSORT V1R10 PTF UK90025 or z/OS DFSORT V1R12 PTF UK90026 (Oct, 2010) to use TRAN=HEX. If you don't have this PTF installed, ask your System Programmer to install it.

//S1 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD *
             01E4
VAR1     =  '069B'
VAR1234  =  'G'
XYZ      =  '0674'
*PADDING =  ' '
             0E
VAR2345  =  '37'
//SORTOUT DD SYSOUT=*
//SYSIN DD *
  OPTION COPY
  INREC IFTHEN=(WHEN=GROUP,BEGIN=(10,1,CH,EQ,C' '),RECORDS=2,
    PUSH=(21:14,4))
  OUTFIL INCLUDE=(1,3,CH,EQ,C'VAR',AND,21,1,CH,NE,C' '),
    IFOUTLEN=25,
    IFTHEN=(WHEN=INIT,
      BUILD=(1,11,51:21,1,14,1,22,1,15,1,23,1,16,1,24,1,17,1)),
   IFTHEN=(WHEN=(55,1,CH,EQ,C' '),
     OVERLAY=(61:51,4,TRAN=UNHEX,12:61,2,BI,EDIT=(IIIIIIIIIT))),
   IFTHEN=(WHEN=NONE,
     OVERLAY=(61:51,8,TRAN=UNHEX,12:61,4,BI,EDIT=(IIIIIIIIIT)))
/*


SORTOUT would have:

VAR1     =    1501515   
VAR2345  =        999   
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
User avatar
Frank Yaeger
Global moderator
 
Posts: 1080
Joined: Sat Jun 09, 2007 8:44 pm
Has thanked: 0 time
Been thanked: 14 times

Re: combine 2 lines in one with dfsort?

Postby lostcontinent » Fri Jan 21, 2011 3:58 pm

Frank,
thank you very much. wo do not have the PTF installed (and it will take some time until it's done),
so I got another solution:
In a first step, I did some grouping and splicing, so I got a temporary file containing only the needed records with
the "2-record-hex-values" spliced together in one record with a special sign '$', so I can identify the records:

FUNK     =  'GETD'                                                       
PRNAME   =  'PVTG1A1 '                                                   
ANZQ     =      1                                                         
VTN      = $ 01EC0698                                                     
Ausdruck der gelesenen Projektionszeile:                                 
VTN      = $ 01EC0698                                                     
PSB4300  =  '02'                                                         
PSB4040  =  '20011201'                                                   
TEST     = $ 01  A6'                                                     
EDAT     =  '20011130'                                                   
EZEIT    =  '13373574'                                                   
PSB4004  = $ 01760808                                                     
PSB4041  =  '20011231'                                                   
PSB4042  =  'N'                                                           
>>>>>                                                        OK    <<<<< 
FUNK     =  'GETN'                                                       
PRNAME   =  'PVTG1A1 '                                                   
ANZQ     =      1                                                         
VTN      = $ 01EC0698                                                     
>>>>>                                                        NFND  <<<<< 


Now in a second step I converted the hex-codes (indentified by the '$' sign) to decimal:

//SYSIN    DD  *                                             
  SORT FIELDS=COPY                                           
* deal with 4 digit hex number                               
  INREC IFTHEN=(WHEN=(17,1,CH,EQ,C'$',AND,21,2,CH,NE,C'  '), 
    OVERLAY=(31:C'0',19,1,                                   
      C'0',23,1,                                             
      C'0',20,1,                                             
      C'0',24,1,                                             
      C'0',21,1,                                             
      C'0',25,1,                                             
      C'0',22,1,                                             
      C'0',26,1),HIT=NEXT),                                   
* deal with 2 digit hex number                               
  IFTHEN=(WHEN=(17,1,CH,EQ,C'$',AND,21,2,CH,EQ,C'  '),       
    OVERLAY=(31:C'000000000',19,1,                           
      C'0',23,1,                                             
      C'0',20,1,                                             
      C'0',24,1),HIT=NEXT),                                   
* convert hex digits in decimal values                       
  IFTHEN=(WHEN=(17,1,CH,EQ,C'$'),                             
    FINDREP=(STARTPOS=31,ENDPOS=46,                           
    INOUT=(C'0A',C'10',C'0B',C'11',C'0C',C'12',               
           C'0D',C'13',C'0E',C'14',C'0F',C'15')),HIT=NEXT),   
  IFTHEN=(WHEN=ANY,                                           
    BUILD=(1,16,C'  ',19:(31,2,ZD,MUL,+268435456),ADD,       
          (33,2,ZD,MUL,+16777216),ADD,                       
          (35,2,ZD,MUL,+1048576),ADD,                         
          (37,2,ZD,MUL,+65536),ADD,                           
          (39,2,ZD,MUL,+4096),ADD,                           
          (41,2,ZD,MUL,+256),ADD,                             
          (43,2,ZD,MUL,+16),ADD,                             
          (45,2,ZD),TO=ZDF,LENGTH=10))                       
/*                                                           


That works Ok for me:
FUNK     =  'GETD'                                                     
PRNAME   =  'PVTG1A1 '                                                 
ANZQ     =      1                                                     
VTN      =   0001501640                                               
Ausdruck der gelesenen Projektionszeile:                               
VTN      =   0001501640                                               
PSB4300  =  '02'                                                       
PSB4040  =  '20011201'                                                 
TEST     =   0000002582                                               
EDAT     =  '20011130'                                                 
EZEIT    =  '13373574'                                                 
PSB4004  =   0001601640                                               
PSB4041  =  '20011231'                                                 
PSB4042  =  'N'                                                       
>>>>>                                                        OK    <<<<
FUNK     =  'GETN'                                                     
PRNAME   =  'PVTG1A1 '                                                 
ANZQ     =      1                                                     
VTN      =   0001501640                                               
>>>>>                                                        NFND  <<<<


Next question: How can I get rid of the leading zeros?
If I put an EDIT=(IIIIIIIIIT) in the BUILD-command it gives me a syntax error?

thanks a lot in advance,
frank
lostcontinent
 
Posts: 13
Joined: Tue Jul 27, 2010 1:47 pm
Has thanked: 0 time
Been thanked: 0 time

Re: combine 2 lines in one with dfsort?

Postby lostcontinent » Fri Jan 21, 2011 5:40 pm

solved:
I put an additional '$' directly after the decimal value and then:
* get rid of leading zeros                                     
  OUTREC IFTHEN=(WHEN=(17,1,CH,EQ,C'$'),                       
    BUILD=(1,18,19,11,JFY=(SHIFT=LEFT,PREBLANK=C'0')),HIT=NEXT),
* check if JFY gave just a $, then replace it with 0           
  IFTHEN=(WHEN=(17,1,CH,EQ,C'$',AND,19,1,CH,EQ,C'$'),           
    BUILD=(1,18,C'0'),HIT=NEXT),                               
* replace $ with blank                                         
  IFTHEN=(WHEN=(17,1,CH,EQ,C'$'),                               
    FINDREP=(INOUT=(C'$',C' '),STARTPOS=17,ENDPOS=30))           

if there is a better/easier way to do this, please let me know ;-)
lostcontinent
 
Posts: 13
Joined: Tue Jul 27, 2010 1:47 pm
Has thanked: 0 time
Been thanked: 0 time


Return to DFSORT/ICETOOL/ICEGENER

 


  • Related topics
    Replies
    Views
    Last post