On Nov 17, 5:52 am, Tim Chase <[EMAIL PROTECTED]> wrote: > >> 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
Thank for your reply. I will have to study your code and see if I can inprove mine. Len -- http://mail.python.org/mailman/listinfo/python-list