Page 1 of 2

Syncsort numeric processing

PostPosted: Thu Apr 15, 2010 11:02 pm
by Doug
My input fields are coming in like this
342.42
178.5
178.5
178.5
2432.05
0
0

I would like to translate these into a usable numeric number.

I am not sure which keyword I should be using (edit? , overlay?)

Any help is appreciated.

Thanks, Doug

Re: Syncsort numeric processing

PostPosted: Fri Apr 16, 2010 12:29 am
by dick scherrer
Hello and welcome to the forum,

I would like to translate these into a usable numeric number.

What output do you want from that "input"?

Re: Syncsort numeric processing

PostPosted: Fri Apr 16, 2010 12:37 am
by Doug
a packed decimal field would be fine....

or even a similar floating point number but where the decimal is consistently in the same spot.

Thanks, Doug

Re: Syncsort numeric processing

PostPosted: Fri Apr 16, 2010 12:43 am
by Alissa Margulies
The following code produces the output below:
//STEP1 EXEC PGM=SORT       
//SYSOUT  DD SYSOUT=*       
//SORTOUT DD SYSOUT=*       
//SORTIN  DD *             
342.42                     
178.5                       
178.5                       
178.5                       
2432.05                     
0                           
0                           
//SYSIN   DD *             
   SORT FIELDS=COPY         
   INREC FIELDS=(1,7,UFF,ZD)
/*                         

0034242
0001785
0001785
0001785
0243205
0000000
0000000

If so desired, you can then use OUTREC to insert the decimal point.
Please let us know if this is example is helpful or if you require further assistance.

Re: Syncsort numeric processing

PostPosted: Fri Apr 16, 2010 12:50 am
by Doug
Hi Alissa,
This solution gives the wrong output for 178.5

The output should be 0017850


I also should hae included an example with no decimal at all.... say 225

This should come out as 0022500 to be of any use.

Thanks anyways,
Doug

Re: Syncsort numeric processing

PostPosted: Fri Apr 16, 2010 1:26 am
by Alissa Margulies
Give this one a try:
//SORT   EXEC PGM=SORT                                   
//SYSOUT   DD SYSOUT=*                                   
//SORTIN   DD *                                         
342.42                                                   
178.5                                                   
2432.05 
255                                               
0                                                       
//SORTOUT  DD SYSOUT=*                                   
//SYSIN    DD *                                         
  INREC IFTHEN=(WHEN=INIT,                               
  PARSE=(%01=(ENDBEFR=C'.',FIXLEN=4),                   
         %02=(ENDBEFR=C' ',FIXLEN=2))),                 
   IFTHEN=(WHEN=INIT,                                   
   BUILD=(1:%01,JFY=(SHIFT=RIGHT),                       
          5:C'.',                                       
          6:%02,JFY=(SHIFT=LEFT)))                       
   SORT FIELDS=COPY                                     
   OUTREC FINDREP=(INOUT=(C' ',C'0'),STARTPOS=1,ENDPOS=7)
//*                                                     

The following is the output produced by the above job:
0342.42
0178.50
2432.05
0255.00
0000.00

If you do not want the decimal point in the output, then you can use the following modified code instead:
//SYSIN    DD *                                           
  INREC IFTHEN=(WHEN=INIT,                               
  PARSE=(%01=(ENDBEFR=C'.',FIXLEN=4),                     
         %02=(ENDBEFR=C' ',FIXLEN=2))),                   
   IFTHEN=(WHEN=INIT,                                     
   BUILD=(1:%01,JFY=(SHIFT=RIGHT),                       
          5:%02,JFY=(SHIFT=LEFT)))                       
   SORT FIELDS=COPY                                       
   OUTREC FINDREP=(INOUT=(C' ',C'0'),STARTPOS=1,ENDPOS=6)
//*                                                       

And here is the new output:
034242
017850
243205
025500
000000

Re: Syncsort numeric processing

PostPosted: Fri Apr 16, 2010 7:17 pm
by Doug
Hi Alissa,
It looks like this solution will work fine... :)

Let's say the numeric field I am fixing up starts in column 27 and goes for a length of 8.

How would the inrec clause look then??


Thanks, Doug

Re: Syncsort numeric processing

PostPosted: Fri Apr 16, 2010 9:07 pm
by Alissa Margulies
Hi Doug.

Please see this example:
//SORT   EXEC PGM=SORT                                     
//SYSOUT   DD SYSOUT=*                                     
//SORTIN   DD *                                           
XXXXXXXXXXXXXXXXXXXXXXXXXX31242.42                         
YYYYYYYYYYYYYYYYYYYYYYYYYY178.5                           
ZZZZZZZZZZZZZZZZZZZZZZZZZZ2432.05                         
AAAAAAAAAAAAAAAAAAAAAAAAAA255                             
BBBBBBBBBBBBBBBBBBBBBBBBBB0                               
//SORTOUT  DD SYSOUT=*                                     
//SYSIN    DD *                                           
  INREC IFTHEN=(WHEN=INIT,                                 
  PARSE=(%00=(FIXLEN=26),                                 
         %01=(ENDBEFR=C'.',FIXLEN=5),                     
         %02=(ENDBEFR=C' ',FIXLEN=2))),                   
   IFTHEN=(WHEN=INIT,                                     
   BUILD=(1:%00,                                           
         27:%01,JFY=(SHIFT=RIGHT),                         
         32:%02,JFY=(SHIFT=LEFT)))                         
   SORT FIELDS=COPY                                       
   OUTREC FINDREP=(INOUT=(C' ',C'0'),STARTPOS=27,ENDPOS=33)
//*                                                       

Output produced:
XXXXXXXXXXXXXXXXXXXXXXXXXX3124242
YYYYYYYYYYYYYYYYYYYYYYYYYY0017850
ZZZZZZZZZZZZZZZZZZZZZZZZZZ0243205
AAAAAAAAAAAAAAAAAAAAAAAAAA0025500
BBBBBBBBBBBBBBBBBBBBBBBBBB0000000

If this does not provide you with the answer, then please show some sample input records along with your expected output.

Thank you & regards,

Re: Syncsort numeric processing

PostPosted: Tue Apr 20, 2010 12:03 am
by Doug
Hi Alissa,
This solution worked fine when I was only fixing one field.
When I tried to apply the principle to the next field I got very weird output.

Here is my input file

----+----1----+----2----+----3----+----4----+
9      0            0               0       
9      618.48   CAD 0               0       
9      57.22    CAD 0               0       
9V1046 85.58    CAD 0               0       
9      156.79   CAD 0               0       
9      144.48   CAD 0               0       
9      202.6    CAD 202.6    PDR    0       
9      24.71    CAD 0               0       
944021 14930.49 USD 0               0       
97802  300      USD 0               0       


My 1st amount that needs to be fixed is in col 7-16
2nd amount is in col 20-29
3rd amount is in col 36-45


My expected output would be
----+----1----+----2----+----3----+----4----+
9     0000000.00   0000000.00      0000000.00
9     0000618.48CAD0000000.00      0000000.00
9     0000057.22CAD0000000.00      0000000.00
9V10460000085.58CAD0000000.00      0000000.00
9     0000156.79CAD0000000.00      0000000.00
9     0000144.48CAD0000000.00      0000000.00
9     0000202.60CAD0000202.60PDR   0000000.00
9     0000024.71CAD0000000.00      0000000.00
9440210014930.49USD0000000.00      0000000.00
97802 0000300.00USD0000000.00      0000000.00


Thanks for all of your suggestions.
Doug

Re: Syncsort numeric processing

PostPosted: Tue Apr 20, 2010 12:04 am
by dick scherrer
Hello,

What actually was output?