1.1 --- a/simplex/readers.py Sat Oct 01 17:59:20 2011 +0200
1.2 +++ b/simplex/readers.py Sat Oct 01 19:33:58 2011 +0200
1.3 @@ -1,7 +1,7 @@
1.4 #!/usr/bin/env python
1.5
1.6 """
1.7 -Reader and accessor classes for indexing.
1.8 +Reader classes for indexing.
1.9
1.10 Copyright (C) 2011 Paul Boddie <paul@boddie.org.uk>
1.11
1.12 @@ -22,9 +22,9 @@
1.13
1.14 "A generic file wrapper."
1.15
1.16 - def __init__(self, f, accessor):
1.17 + def __init__(self, f, iterator):
1.18 self.f = f
1.19 - self.accessor = accessor
1.20 + self.iterator = iterator
1.21
1.22 def seek(self, pos):
1.23 self.f.seek(pos)
1.24 @@ -33,62 +33,8 @@
1.25
1.26 "A wrapper around text files."
1.27
1.28 - def get_records(self):
1.29 - return Iterator(self.f.xreadlines(), self.accessor)
1.30 -
1.31 -class Iterator:
1.32 -
1.33 - "An iterator over records employing record accessors."
1.34 -
1.35 - def __init__(self, records, accessor):
1.36 - self.records = records
1.37 - self.accessor = accessor
1.38 - self.iterator = None
1.39 -
1.40 def __iter__(self):
1.41 - self.iterator = iter(self.records)
1.42 - return self
1.43 -
1.44 - def next(self):
1.45 - if self.iterator is None:
1.46 - iter(self)
1.47 - record = self.iterator.next()
1.48 - return self.accessor.get_key(record), record
1.49 -
1.50 -class DelimitedRecord:
1.51 -
1.52 - "An accessor using a delimiter to split a record."
1.53 -
1.54 - def __init__(self, keys=None, delimiter=None, numeric=0):
1.55 -
1.56 - """
1.57 - Initialise the accessor using a sequence of 'keys' indicating the
1.58 - columns in each record that provide the values in the eventual compound
1.59 - key provided by each record, along with a 'delimiter' indicating how
1.60 - such columns are identified. If 'numeric' is set to a true value, keys
1.61 - will be interpreted as numbers.
1.62 - """
1.63 -
1.64 - self.keys = keys or [0]
1.65 - self.delimiter = delimiter
1.66 - self.numeric = numeric
1.67 -
1.68 - # Define a conversion method.
1.69 -
1.70 - self.convert = numeric and self.convert_numeric or (lambda x: x)
1.71 -
1.72 - def convert_numeric(self, term):
1.73 - return map(int, term)
1.74 -
1.75 - def get_key(self, record):
1.76 - values = record.split(self.delimiter)
1.77 - return self.convert([values[key] for key in self.keys])
1.78 -
1.79 - def get_sort_command(self):
1.80 - return "sort%s%s%s" % (
1.81 - self.delimiter and (" -t $'%s'" % repr(self.delimiter)[1:-1]) or "",
1.82 - self.numeric and " -n" or "",
1.83 - "".join([(" -k %d,%d" % (key + 1, key + 1)) for key in self.keys])
1.84 - )
1.85 + self.iterator.set_records(self.f.xreadlines())
1.86 + return self.iterator
1.87
1.88 # vim: tabstop=4 expandtab shiftwidth=4