[CMS-PIPELINES] reversing *parts* of a record
I am trying to deal with a problem apparently created for me by Mr. Gates Co. I need to send files from CMS to end users on PCs, where the files contain data which represents Hebrew characters. I gave SMTP a translation table which converts the EBCDIC representation of Hebrew to the ASCII used by Windows, but the PC is a smart alec, and also reverses the character order, since Hebrew reads right to left. So, if I have input records like this on CMS: 2008 12987 65084 abcdefgh78346 45239 tuvwxyz873468 2009 31 836 ijklmno 169827 8373 mnop 34902 (Note: the letters in the actual record will be Hebrew! I only used English to prevent the confusion that happens when the order gets reversed. And besides, how many of you have Hebrew fonts?). If I SendFile a file of those records to a MS-Win system, the characters will be displayed on the screen as hgfedcba, zyxwvut, etc. In order to have the data normal when it arrives, I need to reverse the field which contains the Hebrew text, but obviously NOT the other parts of the record, which would destroy the numeric values. What I think would be my favorite solution would be for the REVERSE stage to accept inputranges, as the XLATE stage does. That would be great! A simple ... | REVERSE 22-31 48-56 | ... would solve my problem easily and elegantly. But... REVERSE has no ranges. :-( Since the EXEC I am writing must deal with many different files, and will receive external arguments defining the positions of the Hebrew fields, I need a generalized solution. I tried something with a particular case, where I knew the positions (only one Hebrew field 5-24) and the record length (fixed 32): ... 'F1: FANOUT |', 'F2: FANINANY |', 'JOIN 1 |', 'SPECS 1-32 1 33-* 5 |', '' OUTPUTID, '? F1: |', 'SPECS 5-24 1 |', 'REVERSE |', 'F2:' How would I generalize this? And is there a better way? Thanks! Shimon
Re: [CMS-PIPELINES] reversing *parts* of a record
3WAY gets you one range of a record. You'll need two, the second on the tertiary output from the first. |w1: 3way w4 |g1: gather \w1: |reverse |g1: \w1: |w2: 3way w-2 |g1: \w2: |reverse |g1: \w2: |g1: j. 2009/8/25 Shimon Lebowitz shimon...@gmail.com: I am trying to deal with a problem apparently created for me by Mr. Gates Co. I need to send files from CMS to end users on PCs, where the files contain data which represents Hebrew characters. I gave SMTP a translation table which converts the EBCDIC representation of Hebrew to the ASCII used by Windows, but the PC is a smart alec, and also reverses the character order, since Hebrew reads right to left. So, if I have input records like this on CMS: 2008 12987 65084 abcdefgh 78346 45239 tuvwxyz 873468 2009 31 836 ijklmno 169827 8373 mnop 34902 (Note: the letters in the actual record will be Hebrew! I only used English to prevent the confusion that happens when the order gets reversed. And besides, how many of you have Hebrew fonts?). If I SendFile a file of those records to a MS-Win system, the characters will be displayed on the screen as hgfedcba, zyxwvut, etc. In order to have the data normal when it arrives, I need to reverse the field which contains the Hebrew text, but obviously NOT the other parts of the record, which would destroy the numeric values. What I think would be my favorite solution would be for the REVERSE stage to accept inputranges, as the XLATE stage does. That would be great! A simple ... | REVERSE 22-31 48-56 | ... would solve my problem easily and elegantly. But... REVERSE has no ranges. :-( Since the EXEC I am writing must deal with many different files, and will receive external arguments defining the positions of the Hebrew fields, I need a generalized solution. I tried something with a particular case, where I knew the positions (only one Hebrew field 5-24) and the record length (fixed 32): ... 'F1: FANOUT |', 'F2: FANINANY |', 'JOIN 1 |', 'SPECS 1-32 1 33-* 5 |', '' OUTPUTID, '? F1: |', 'SPECS 5-24 1 |', 'REVERSE |', 'F2:' How would I generalize this? And is there a better way? Thanks! Shimon
Re: [CMS-PIPELINES] reversing *parts* of a record
Couldn't you use Specs to do this? Assign those parts of the record that need to be reversed to a variable and use print reverse(var) to build the output record? For example PIPE Strliteral /abcdefg 12345 hijklmn 6789/ | Specs a: w1 . b: w3 . print reverse(a) 1 w2 nw print reverse(b) nw w4 nw | Console produces: gfedcba 12345 nmlkjih 6789 -- bc On Tue, Aug 25, 2009 at 7:17 AM, John P. Hartmannjphartm...@gmail.com wrote: 3WAY gets you one range of a record. You'll need two, the second on the tertiary output from the first. |w1: 3way w4 |g1: gather \w1: |reverse |g1: \w1: |w2: 3way w-2 |g1: \w2: |reverse |g1: \w2: |g1: j. 2009/8/25 Shimon Lebowitz shimon...@gmail.com: I am trying to deal with a problem apparently created for me by Mr. Gates Co. I need to send files from CMS to end users on PCs, where the files contain data which represents Hebrew characters. I gave SMTP a translation table which converts the EBCDIC representation of Hebrew to the ASCII used by Windows, but the PC is a smart alec, and also reverses the character order, since Hebrew reads right to left. So, if I have input records like this on CMS: 2008 12987 65084 abcdefgh 78346 45239 tuvwxyz 873468 2009 31 836 ijklmno 169827 8373 mnop 34902 (Note: the letters in the actual record will be Hebrew! I only used English to prevent the confusion that happens when the order gets reversed. And besides, how many of you have Hebrew fonts?). If I SendFile a file of those records to a MS-Win system, the characters will be displayed on the screen as hgfedcba, zyxwvut, etc. In order to have the data normal when it arrives, I need to reverse the field which contains the Hebrew text, but obviously NOT the other parts of the record, which would destroy the numeric values. What I think would be my favorite solution would be for the REVERSE stage to accept inputranges, as the XLATE stage does. That would be great! A simple ... | REVERSE 22-31 48-56 | ... would solve my problem easily and elegantly. But... REVERSE has no ranges. :-( Since the EXEC I am writing must deal with many different files, and will receive external arguments defining the positions of the Hebrew fields, I need a generalized solution. I tried something with a particular case, where I knew the positions (only one Hebrew field 5-24) and the record length (fixed 32): ... 'F1: FANOUT |', 'F2: FANINANY |', 'JOIN 1 |', 'SPECS 1-32 1 33-* 5 |', '' OUTPUTID, '? F1: |', 'SPECS 5-24 1 |', 'REVERSE |', 'F2:' How would I generalize this? And is there a better way? Thanks! Shimon
Re: [CMS-PIPELINES] reversing *parts* of a record
While all-pipes solutions are usually elegant and always inherently cool, either Bob's or the Piper's could be a challenge to build dynamically. I'd probably use one or the other - or something similar - for a fixed case, but I think Shimon's search for a generalized solution would be more easily addressed by a Rexx stage and wouldn't suffer that much of a performance penalty. -- Mike Harding CMSTSO Pipelines Discussion List CMS-PIPELINES@VM.MARIST.EDU wrote on 08/25/2009 07:40:44 AM: From: Bob Cronin bob.cro...@gmail.com To: CMS-PIPELINES@VM.MARIST.EDU Date: 08/25/2009 07:41 AM Subject: Re: reversing *parts* of a record Sent by: CMSTSO Pipelines Discussion List CMS-PIPELINES@VM.MARIST.EDU Couldn't you use Specs to do this? Assign those parts of the record that need to be reversed to a variable and use print reverse(var) to build the output record? For example PIPE Strliteral /abcdefg 12345 hijklmn 6789/ | Specs a: w1 . b: w3 . print reverse(a) 1 w2 nw print reverse(b) nw w4 nw | Console produces: gfedcba 12345 nmlkjih 6789 -- bc On Tue, Aug 25, 2009 at 7:17 AM, John P. Hartmannjphartm...@gmail.com wrote: 3WAY gets you one range of a record. You'll need two, the second on the tertiary output from the first. |w1: 3way w4 |g1: gather \w1: |reverse |g1: \w1: |w2: 3way w-2 |g1: \w2: |reverse |g1: \w2: |g1: j. 2009/8/25 Shimon Lebowitz shimon...@gmail.com: I am trying to deal with a problem apparently created for me by Mr. Gates Co. I need to send files from CMS to end users on PCs, where the files contain data which represents Hebrew characters. I gave SMTP a translation table which converts the EBCDIC representation of Hebrew to the ASCII used by Windows, but the PC is a smart alec, and also reverses the character order, since Hebrew reads right to left. So, if I have input records like this on CMS: 2008 12987 65084 abcdefgh 78346 45239 tuvwxyz 873468 2009 31 836 ijklmno 169827 8373 mnop 34902 (Note: the letters in the actual record will be Hebrew! I only used English to prevent the confusion that happens when the order gets reversed. And besides, how many of you have Hebrew fonts?). If I SendFile a file of those records to a MS-Win system, the characters will be displayed on the screen as hgfedcba, zyxwvut, etc. In order to have the data normal when it arrives, I need to reverse the field which contains the Hebrew text, but obviously NOT the other parts of the record, which would destroy the numeric values. What I think would be my favorite solution would be for the REVERSE stage to accept inputranges, as the XLATE stage does. That would be great! A simple ... | REVERSE 22-31 48-56 | ... would solve my problem easily and elegantly. But... REVERSE has no ranges. :-( Since the EXEC I am writing must deal with many different files, and will receive external arguments defining the positions of the Hebrew fields, I need a generalized solution. I tried something with a particular case, where I knew the positions (only one Hebrew field 5-24) and the record length (fixed 32): ... 'F1: FANOUT |', 'F2: FANINANY |', 'JOIN 1 |', 'SPECS 1-32 1 33-* 5 |', '' OUTPUTID, '? F1: |', 'SPECS 5-24 1 |', 'REVERSE |', 'F2:' How would I generalize this? And is there a better way? Thanks! Shimon
Re: [CMS-PIPELINES] reversing *parts* of a record
That was what I ended up doing. A REXX stage that performs a loop on each record, using a parse template with variables as positional parsing points, and the rexx reverse function. It is fully adaptable to any number of fields, in any columns. I have not done any measurements, but it 'feels' quick enough. :-) Thanks, Shimon On Tue, Aug 25, 2009 at 10:55 AM, Michael Harding mhard...@us.ibm.comwrote: While all-pipes solutions are usually elegant and always inherently cool, either Bob's or the Piper's could be a challenge to build dynamically. I'd probably use one or the other - or something similar - for a fixed case, but I think Shimon's search for a generalized solution would be more easily addressed by a Rexx stage and wouldn't suffer that much of a performance penalty. -- Mike Harding CMSTSO Pipelines Discussion List CMS-PIPELINES@VM.MARIST.EDU wrote on 08/25/2009 07:40:44 AM: From: Bob Cronin bob.cro...@gmail.com To: CMS-PIPELINES@VM.MARIST.EDU Date: 08/25/2009 07:41 AM Subject: Re: reversing *parts* of a record Sent by: CMSTSO Pipelines Discussion List CMS-PIPELINES@VM.MARIST.EDU Couldn't you use Specs to do this? Assign those parts of the record that need to be reversed to a variable and use print reverse(var) to build the output record? For example PIPE Strliteral /abcdefg 12345 hijklmn 6789/ | Specs a: w1 . b: w3 . print reverse(a) 1 w2 nw print reverse(b) nw w4 nw | Console produces: gfedcba 12345 nmlkjih 6789 -- bc On Tue, Aug 25, 2009 at 7:17 AM, John P. Hartmannjphartm...@gmail.com wrote: 3WAY gets you one range of a record. You'll need two, the second on the tertiary output from the first. |w1: 3way w4 |g1: gather \w1: |reverse |g1: \w1: |w2: 3way w-2 |g1: \w2: |reverse |g1: \w2: |g1: j. 2009/8/25 Shimon Lebowitz shimon...@gmail.com: I am trying to deal with a problem apparently created for me by Mr. Gates Co. I need to send files from CMS to end users on PCs, where the files contain data which represents Hebrew characters. I gave SMTP a translation table which converts the EBCDIC representation of Hebrew to the ASCII used by Windows, but the PC is a smart alec, and also reverses the character order, since Hebrew reads right to left. So, if I have input records like this on CMS: 2008 12987 65084 abcdefgh78346 45239 tuvwxyz873468 2009 31 836 ijklmno 169827 8373 mnop 34902 (Note: the letters in the actual record will be Hebrew! I only used English to prevent the confusion that happens when the order gets reversed. And besides, how many of you have Hebrew fonts?). If I SendFile a file of those records to a MS-Win system, the characters will be displayed on the screen as hgfedcba, zyxwvut, etc. In order to have the data normal when it arrives, I need to reverse the field which contains the Hebrew text, but obviously NOT the other parts of the record, which would destroy the numeric values. What I think would be my favorite solution would be for the REVERSE stage to accept inputranges, as the XLATE stage does. That would be great! A simple ... | REVERSE 22-31 48-56 | ... would solve my problem easily and elegantly. But... REVERSE has no ranges. :-( Since the EXEC I am writing must deal with many different files, and will receive external arguments defining the positions of the Hebrew fields, I need a generalized solution. I tried something with a particular case, where I knew the positions (only one Hebrew field 5-24) and the record length (fixed 32): ... 'F1: FANOUT |', 'F2: FANINANY |', 'JOIN 1 |', 'SPECS 1-32 1 33-* 5 |', '' OUTPUTID, '? F1: |', 'SPECS 5-24 1 |', 'REVERSE |', 'F2:' How would I generalize this? And is there a better way? Thanks! Shimon
Re: [CMS-PIPELINES] reversing *parts* of a record
Rob van der Heij wrote: son of zone stage that has the 3way topology of John under the covers (with addpipe, in case you want to make it yourself). You use it like this: sozone 22-31 reverse | sozone 48-56 reverse I didn't think of this last year when you posted it as 3LIGHT, but it could be enhanced for cases like this by accepting more than one zone (assuming them to be nonoverlapping, and splitting them out from right to left): ... | sozone (22-31 48-56) reverse | ... One question this raises is whether something like SPECS NUMBER should treat the zones as separate files or one interleaved file: (end /) ... / z1: | specs number ... / z2: | specs number ... vs. (end /) ... / z1: | z: gather | specs number ... | zn: deal | ... / z2: | z: / zn: | ... The latter could be nice in cases where the zones are all instances of the same thing, but it would get complicated to accommodate missing records as you did by using COPY|SPECS instead of GATHER|JOIN in 3LIGHT. It would take some tricky use of JUXTAPOSE or PREDSELECT to generate null records in place of the missing ones. ¬R