[CMS-PIPELINES] reversing *parts* of a record

2009-08-25 Thread Shimon Lebowitz
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

2009-08-25 Thread John P. Hartmann
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

2009-08-25 Thread Bob Cronin
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

2009-08-25 Thread Michael Harding
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

2009-08-25 Thread Shimon Lebowitz
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

2009-08-25 Thread Glenn Knickerbocker
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