Working with CSV Files from the Command Line
How to extract and manipulate CSV data from the command line.
Linux Journal is the premier source for how-tos, projects, product reviews, expert advice and opinions for everything Linux.
| We're Linux, Again | Feb 09, 2010 |
| Quick Compiz Screenshots | Feb 09, 2010 |
| Welcome to the New LinuxJournal.com | Feb 09, 2010 |
| Symbian Opens Up | Feb 04, 2010 |
| The Small Picture: More OpenOffice.org Extensions | Feb 04, 2010 |
| Pass the Bug, Collect $500 | Feb 02, 2010 |
This week 5 lucky Members will receive a copy of The Official Ubuntu Server Book by Benjamin Mako Hill and Linux Journal's very own Kyle Rankin. No entry necessary. Check back here early next week to find out who the lucky Online Members are.
Linux Journal, currently celebrating its 16th year of publication, is the original magazine of the global Linux community, delivering readers the advice and inspiration they need to get the most out of their Linux systems.
In-depth information provides a full 360-degree look at featured topics relating to Linux, giving a comprehensive source of everything readers need for creating and completing their own projects -- not just tools they will use today, but relevant and encompassing information they will turn to in future months and years. In addition to how-to content, Linux Journal includes opinions, new product information, profiles of leaders making major contributions in Open Source and product reviews. It also covers business, social and technical news and developments in order to fulfill its mission as the central forum and advocate for the greater Linux community throughout the world.

Comments
I recommend the csv module
I recommend the csv module in python.
http://docs.python.org/library/csv.html
It is really easy to use and handles fields with embedded newlines, quotes, commas with flying colors!
Give it a shot some time, you won't be disappointed :).
-TH
Big caveat
Most CSV files I get these days have quoted strings containing commas inside the quoted field between the separators.
You'd better be very sure of your CSV contents if you're going to use cut like this.
It'll fail on this CSV file:
1,Cat food,55.69,05/04/2009
2,Power bill,149.75,03/04/2009
3,Rent,"1,350.00",01/04/2009
Use Grep
My original thinking was to use grep:
to extract the email but I decided on cut to simplify the "look" of it a bit for the video.
Of course your sample doesn't include any emails so that wouldn't work... so you'd have to adapt/change it to extract the right field.
A perhaps more robust method is to convert the CSV file to use tabs rather than commas. With tabs cut should work most of the time. Still might be that you'd have quoted tabs, but unless your CSV came from a database dump that seems unlikely.
Mitch Frazier is an Associate Editor for Linux Journal and the Web Editor for linuxjournal.com.
How will grep help us parse?
That grep will identify lines that are CSV, but won't parse out the values. And yes, I deal with tons of huge CSV files that go in and out of databases, so it's important that I get my scripts right.
The only thing I've found that comes close to what I need is http://perlmeme.org/tutorials/parsing_csv.html -- so I'm in the process of rewriting that in to something bash can invoke from inside shell scripts.
Forgot an option
Forgot the -o option:
that will show you only the part that matched.
Mitch Frazier is an Associate Editor for Linux Journal and the Web Editor for linuxjournal.com.
But that's still not "parsing"
Sure, that'll extract an email address, but it doesn't fit any accepted definition of "parsing," since it assumes that you have prior knowledge of what's in the field and can't properly handle cases of having more than one @ in any line.
You're handling strings of text of which you can predict formatting, but you are certainly not using techniques that are transferrable to the general case of "I need to parse a CSV file."
That's Correct
You're 100% right, neither cut nor grep are generalized solutions for parsing CSV files, but then again I never said they were. As far as I know I never used the word parse, that was your word.
What I meant to say was that grep is both a floor wax and a dessert topping..png)
Mitch Frazier is an Associate Editor for Linux Journal and the Web Editor for linuxjournal.com.
No need for uniq
GNU
sorthas a--unique(-u) argument that checks sorts and checks for uniqueness in the same pass. So you can just use "sort -uf" or "sort --ignore-case --unique" skippinguniqaltogether.-Tim
Thanks
Yes it does and that's why I always say one should re-RTFM once in a while to refresh one's memory and check for new features.
.png)
I might also add that one shouldn't jump to the the conclusion that the -u option makes uniq obsolete: uniq has some other useful options that come in handy once in a while. So re-RTFM applies to uniq also.
Mitch Frazier is an Associate Editor for Linux Journal and the Web Editor for linuxjournal.com.
Beat me to it
I'm glad somebody mentioned this; I found out about that a couple of months ago. Much better than having to pipe to yet another process :D
Post new comment