8 ms·
Show HN: Command Line Tool to Sort CSV and TSV Files by Multiple Headings in Go
- johnweldon 9y agoWorks great with previously shared Go command line tool jw4.us/to8 when input files are not UTF8. Use to8 to convert from UTF(32|16)(LE)? etc. to UTF8 first, then sort with this tool.
- donatj 9y agoIs there an advantage to to8 over iconv? I've used iconv for years and it's never let me down.
- johnweldon 9y agoI wrote this tool because I don't want to explicitly know the original encoding, I just want _any_ encoding to be converted to UTF8. AFAIK, iconv requires the source encoding to be specified on the command line.
- z1mm32m4n 9y agoI’m a huge fan of csvkit, which includes a similar utility along with lots more: http://csvkit.readthedocs.io/en/1.0.2/scripts/csvsort.html http://csvkit.readthedocs.io/en/1.0.2/scripts/csvsort.html Some of my favorites tools it includes are csvsql and csvlook.
- johnweldon 9y agoCool, looks like a nicely built set of utilities in python. Thanks for the link.
- taylodl 9y agoThanks! csvkit looks awesome!
- feelin_googley 9y agoCan anyone provide sample input and output for the example? I find it difficult to evaluate text processing software quickly against existing solutions when there is no example given, such as: here is some sample input and here is the desired output, as is done at, e.g., unix.com.
- johnweldon 9y agoI updated the README.md with some example usage and output. Thanks for the feedback.
- sigil 9y agoEquivalent sort(1) invocations for your examples: sort -k2 -k1 -k3 contacts.tsv sort -k1 -k2 -k3 contacts.tsv This assumes TSV input, but there are plenty of reasons to prefer that to CSV. If I'm working from CSV sources I usually convert to TSV first thing in my shell pipeline.
- johnweldon 9y agoThanks - I've used sort quite a bit, and I like it. I wrote this partly to just fulfil my desire to sort by named fields rather than column indexes.
- sigil 9y agoI know the annoyance you're talking about, but I think you're better off wrapping sort(1) with something translates from column names to indexes. Among the reasons: sortcsv buffers all input into memory [1], while sort(1) uses a divide-and-conquer merge sort to avoid this. [1] https://github.com/johnweldon/sortcsv/blob/55818bd8e5f9feeccc242b78acc3f23fd0613b44/main.go#L68 https://github.com/johnweldon/sortcsv/blob/55818bd8e5f9feecc...
- johnweldon 9y agoThat's a good point. I may consider a stand alone utility to wrap this[1] code that converts names to indexes. [1] https://github.com/johnweldon/sortcsv/blob/master/main.go#L104-L118 https://github.com/johnweldon/sortcsv/blob/master/main.go#L1...
- feelin_googley 9y agoWhen sort is used on really large files, it will automatically attempt to use disk, putting temp files in TMPDIR. This can be really slow. To overcome the slowdown of disk I/O, perhaps a workaround could be to use mfs or tmpfs, maybe something like: mkdir /dir mount -t tmpfs tmpfs /dir TMPDIR=/dir sort -k2 -k1 -k3 contacts.tsv TMPDIR=/dir sort -k1 -k2 -k3 contacts.tsv Personally, I gave up on sort for large files and use k/kdb+. I suspect it is faster for sorting than sort or the Go libraries, but I could be wrong.
- bfrog 9y agoI've been using https://github.com/BurntSushi/xsv https://github.com/BurntSushi/xsv which is quite nice and has a few other very handy csv tools.
- johnweldon 9y agoI hadn't seen that tool, thanks for pointing it out.
- bfrog 9y agoIndeed, perhaps it will give you some fun ideas!
- danso 9y agoxsv is fantastic. I'm a longtime user and fan of csvkit but I've slowly switched some of my habitual usage to xsv. Note that csvkit -- not being a single program like xsv but rather a collection of utilities -- contains a few branches of functionality that xsv doesn't aim to replicate, namely csvsql (convert CSV into SQL create and insert statements) and in2csv (convert XLS and JSON to CSV).
- mdaniel 9y agoWhile not "in Go", Homebrew showed me this tool a while back and I like it bunches: > Miller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON. https://github.com/johnkerl/miller#readme https://github.com/johnkerl/miller#readme