# HG changeset patch # User Jeff Hammel # Date 1424717413 28800 # Node ID 18c0820bfe12f35f0a78f712988d90196f8cc7b4 # Parent 82a18c9337c3ccde5373b711fd4721d942b233b9 stub concatenating columns diff -r 82a18c9337c3 -r 18c0820bfe12 numerics/cat_columns.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/numerics/cat_columns.py Mon Feb 23 10:50:13 2015 -0800 @@ -0,0 +1,95 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +output columns of various CSV files + +Example:: + +> cat-columns foo.csv:0 bar.csv:1,2,3 fleem.csv + +This will generate CSV output with the first column from `foo.csv`, +the 2nd, 3rd, and 4th columns from `bar.csv`, +and all columns from `fleem.csv`. +""" + +# imports +import argparse +import csv +import os +import sys +import time +from collections import OrderedDict +from .read import read_csv + +# module globals +__all__ = ['cat_columns', 'CatColumnParser', 'main'] + +def cat_columns(csv_files): + """ + csv_files -- an iterable of 2-tuples of `path`, columns + """ + + rows = [] + +class CatColumnParser(argparse.ArgumentParser): + """CLI option parser""" + def __init__(self, **kwargs): + kwargs.setdefault('formatter_class', argparse.RawTextHelpFormatter) + kwargs.setdefault('description', __doc__) + argparse.ArgumentParser.__init__(self, **kwargs) + self.add_argument('csv', nargs='+', + help="path to CSV files and columns to output, delimited by ':' and comma-separated") + self.add_argument('-o', '--output', dest='output', + type=argparse.FileType('a'), default=sys.stdout, + help="where to output to, or stdout by default") + self.options = None + + def parse_args(self, *args, **kw): + options = argparse.ArgumentParser.parse_args(self, *args, **kw) + self.validate(options) + self.options = options + return options + + def validate(self, options): + """validate options""" + +def main(args=sys.argv[1:]): + """CLI""" + + # parse command line options + parser = CatColumnParser() + options = parser.parse_args(args) + + # get the data + csv_files = OrderedDict() + missing = [] + for item in options.csv: + if ':' in item: + path, columns = item.rsplit(':', 1) + columns = columns.strip() + if columns: + columns = [int(column) for column in columns.split(',')] + else: + columns = None + else: + path = item + columns = None + if not os.path.exists(path): + missing.append(path) + if missing: + parser.error("File(s) not found:\n{}".format('\n'.join(missing))) + + # concatenate the rows + data = cat_columns(csv_files.items()) + + # output it + writer = csv.writer(options.output) + for row in data: + writer.write_row(row) + options.output.flush() + +if __name__ == '__main__': + main() + + diff -r 82a18c9337c3 -r 18c0820bfe12 setup.py --- a/setup.py Thu Jan 22 13:41:19 2015 -0800 +++ b/setup.py Mon Feb 23 10:50:13 2015 -0800 @@ -16,6 +16,7 @@ from setuptools import setup kw['entry_points'] = """ [console_scripts] + cat-columns = numerics.cat_columns:main interpolate = numerics.interpolation:main manipulate = numerics.manipulate:main plot = numerics.plot:main