From 76ae48f526cfad971ef921601a50460bbf1553a5 Mon Sep 17 00:00:00 2001 From: Bjoern Brandenburg Date: Thu, 4 Sep 2008 22:12:54 -0400 Subject: add transposing of matrices(= csv files) --- csv_tool | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) (limited to 'csv_tool') diff --git a/csv_tool b/csv_tool index 455037c..10f5ee0 100755 --- a/csv_tool +++ b/csv_tool @@ -71,6 +71,19 @@ def row_reduce(row_op, fixup=lambda key, rows, res: res): row_mul = make_scalar_op(operator.mul) row_div = make_scalar_op(operator.div) +def transpose(rows): + rows = list(rows) + if rows: + r = len(rows) + c = max([len(x) for x in rows]) + def at(x, y): + try: + return rows[x][y] + except IndexError: + return 0 + for i in xrange(c): + yield [at(j, i) for j in xrange(r) ] + def select_by_key(rows, col, cast=None): by_key = defdict(list) order = [] @@ -87,32 +100,42 @@ class CsvApp(defapp.App): def __init__(self): defapp.App.__init__(self, opts, defaults) - def ordered_transform(self, make_iterator): + def transform(self, make_iterator, ordered=True): """Average all rows with the same key in a given column.""" files = list(self.args) del files[0] - try: - for fn in files: + for fn in files: + try: # read in content - (order, by_key) = select_by_key(csv.reader(open(fn, 'r')), - self.options.col, float) + rows = csv.reader(open(fn, 'r')) + # set up transformation + if ordered: + (order, by_key) = select_by_key(rows, self.options.col, float) + rows = make_iterator(order, by_key) + else: + rows = make_iterator(rows) # write out - csv.writer(self.outfile()).writerows(make_iterator(order, by_key)) - except IOError, ex: - print "Error:", ex - + csv.writer(self.outfile()).writerows(rows) + except IOError, ex: + self.err("%s:%s" % (fn, str(ex))) + except IndexError, ex: + self.err("%s: Sorry, index out of range." % fn) + def do_avg(self, _): def fixup_avg(key, rows, res): res = row_div(len(rows), res) res[self.options.col] = key return res - self.ordered_transform(row_reduce(row_add, fixup_avg)) + self.transform(row_reduce(row_add, fixup_avg)) def do_max(self, _): - self.ordered_transform(row_reduce(row_max)) + self.transform(row_reduce(row_max)) def do_min(self, _): - self.ordered_transform(row_reduce(row_min)) + self.transform(row_reduce(row_min)) + + def do_transpose(self, _): + self.transform(transpose, ordered=False) if __name__ == '__main__': CsvApp().launch() -- cgit v1.2.2