|
View previous topic :: View next topic
|
| Author |
Message |
Rohit Umarjikar
Global Moderator

Joined: 21 Sep 2010 Posts: 3109 Location: NYC,USA
|
|
|
|
I have a requirement as below.
Input file FB LREC=50
| Code: |
A1A1,VOL,123.67,,,,
A1A1,VOL,1723.673,JJ,,,
A1A1,,14523.6734,hh,,, |
Expected Output:
| Code: |
A1A1,VOL,123.6700,,,
A1A1,VOL,1723.6730,JJ,,,
A1A1,,14523.6734,hh,,, |
So basically, the format is DECIMAL(14,4)/PIC s9(10)V9(4) comp-3. I am trying to reformat this decimal field ( ONLY right portion of it after decimal ('.')to its max limit by adding zeroes as needed).
And later on I will rewrite this field as PD or if you can do it in the same step then thats is good.
I have tried something but that has more hardcoding stuff, so the approach was to take left portion of it (before '.') and multiply by 10000 and add right portion ( after'.') to it.
e.g.
123.67 ---> 123 multiply by 10000
1230000--- add/overlay 6700 .
1236700--- rewrite as PD
So when I read into PIC s9(10)V9(4) comp-3 then I get the right value back.
Thanks in advance. |
|
| Back to top |
|
 |
Rohit Umarjikar
Global Moderator

Joined: 21 Sep 2010 Posts: 3109 Location: NYC,USA
|
|
|
|
I tried to do something like this which does add trailing zeroes and then convert that to PD which can be done in Build.
input
| Code: |
55.2
343.112
23222.11
23.7786 |
Sort card
| Code: |
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=INIT,
PARSE=(%01=(ABSPOS=1,ENDBEFR=C'.',FIXLEN=10),
%02=(ENDBEFR=C',',FIXLEN=04)),
BUILD=(%01,UFF,EDIT=(TTTTTTTTTT),%02)),
IFTHEN=(WHEN=INIT,
FINDREP=(INOUT=(C' ',C'0'),STARTPOS=11,ENDPOS=15)) |
Output:
| Code: |
00000000552000
00000003431120
00000232221100
00000000237786 |
|
|
| Back to top |
|
 |
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
I think you are basically there.
A couple of things. You don't need the ABSPOS=1. That is the default value for the initial PARSEd field. You need ABSPOS when you want to start the next PARSEd field at a position other than it would naturally be (you want to skip some bytes, or include in the PARSE something you've already PARSEd).
There's also a little thing with ALTSEQ, which removes the need for the FINDREP.
| Code: |
SORT FIELDS=COPY
ALTSEQ CODE=(40F0)
INREC IFTHEN=(WHEN=INIT,
PARSE=(%01=(ENDBEFR=C'.',FIXLEN=10),
%02=(ENDBEFR=C',',FIXLEN=04)),
BUILD=(%01,UFF,EDIT=(TTTTTTTTTT),%02,TRAN=ALTSEQ)) |
That will, for the %02 field, change spaces to zero. |
|
| Back to top |
|
 |
Rohit Umarjikar
Global Moderator

Joined: 21 Sep 2010 Posts: 3109 Location: NYC,USA
|
|
|
|
Thanks Bill for ABSPOS=1. and ALTSEQ.
I just coded ABSPOS=1 because I have this type of decimals appeared couple of times at different postions. |
|
| Back to top |
|
 |
|
|
 |
All times are GMT + 6 Hours |
|