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