Files are fixed format no field delimiters, fields are position and
length records are terminated by newline.

Assuming no COMPUTATIONAL fields, it should be easy enough to split each line 
up into fixed-length pieces, e.g. assuming a simple example

    01 Sample-Record.
      02 Field-1 pic XXX.
      02 Field-2 pic XXXX.
      02 Field-3 pic XXXXX.

then a Python sequence that read one line's worth of fields might be

    line = infile.read()
    (field_1, field_2, field_3) = (line[0:3], line[3:7], line[7:12])


A recent posting on the list offered an elegant solution to this with a function something like

  def splitter(s, *lens):
    offset = 0
    pieces = []
    for length in lens:
      pieces.append(s[offset:offset+length])
      offset += length
    return pieces


which could then be used to simplify that to

  (f1, f1, f3) = splitter(line, 3, 4, 5)

It may not be quite so significant with just 3 items, but the OP mentioned having a large number of items in each record. One could even use something like a mapping for this. Something like:

  field_lens = [
    ("field1", 3),
    ("field2", 4),
    ("field3", 5),
    # stacks more
    ]
  fields = dict(zip(
    (name for name, _ in field_lens),
    splitter(line, *[length for _, length in field_lens])
    ))
  something = "Whatever %s you want" % fields["field2"]

If you like this method, you can even make a more targeted splitter() function and add some function mappings like

  field_lens = [ # somewhat similar to your Cobol masks
    ("field1", 3, str),
    ("field2", 4, int),
    ("field3", 5, float),
    ("field4", 17, lambda s: s.strip().upper() ),
    # stacks more
    ]


  def splitter(s, field_lens):
    pieces = {}
    offset = 0
    for name, length, fn in field_lens:
      pieces[name] = fn(s[offset:offset+length])
      offset += length
    return pieces

  bits = splitter(line), field_lens)
  # do addition of int+float rather than string concat
  print bits["field2"] + bits["field3"]

-tkc




--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to