Skip to content

Instantly share code, notes, and snippets.

@JoeGermuska
Forked from bycoffe/csvcut
Created September 14, 2009 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save JoeGermuska/186930 to your computer and use it in GitHub Desktop.
Save JoeGermuska/186930 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
"""
Like cut, but for CSVs. To be used from a shell command line.
Note that fields are zero-based, as opposed to 'cut' where they are 1-based.
Leveraged from/motivated by an example from @bycoffe
Should use something better than getopt, but this works...
Usage:
csvcut foobar.csv
(prints the first column of each row of foobar.csv)
head -10 foobar.csv | csvcut -f 0,2
(prints the first and third columns of the first ten lines of foobar.csv)
csvcut -f 0,2 -d "|" foobar.csv
(prints the first and third columns of the pipe-delimited foobar.csv)
csvcut -h foobar.csv
(prints the values of the first line of foobar.csv, preceded by the field index which would
be used to display that column. If present, the -f option will be ignored.)
"""
import sys, csv, getopt
opts, args = getopt.getopt(sys.argv[1:], "f:d:h", [])
if args:
i = open(args[0])
else:
i = sys.stdin
delimiter = ','
cols = [0, ]
if opts:
opts = dict(opts)
show_headers = '-h' in opts
if '-f' in opts:
cols = opts['-f'].split(",")
if '-d' in opts:
delimiter = opts['-d']
for row in csv.reader(i, delimiter=delimiter):
if show_headers:
for i,c in enumerate(row):
print "%3i: %s" % (i,c)
break
for c in cols:
print row[int(c)],
print
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment