CSV to JSON using jq
In short - yes, except maybe for the one-liner bit.
jq is often well-suited to text wrangling, and this is especially true of versions with regex support. With regex support, for example, the trimming required by the given problem statement is trivial.
Since jq 1.5rc1 includes regex support and has been available since Jan 1, 2015, the following program assumes a version of jq 1.5; if you wish to make it work with jq 1.4, then see the two "For jq 1.4" comments.
Please also note that this program does not handle CSV in all its generality and complexity. (For a similar approach that does handle CSV more generally, see https://github.com/stedolan/jq/wiki/Cookbook#convert-a-csv-file-with-headers-to-json)
# objectify/1 takes an array of string values as inputs, converts# numeric values to numbers, and packages the results into an object# with keys specified by the "headers" arraydef objectify(headers): # For jq 1.4, replace the following line by: def tonumberq: .; def tonumberq: tonumber? // .; . as $in | reduce range(0; headers|length) as $i ({}; .[headers[$i]] = ($in[$i] | tonumberq) );def csv2table: # For jq 1.4, replace the following line by: def trim: .; def trim: sub("^ +";"") | sub(" +$";""); split("\n") | map( split(",") | map(trim) );def csv2json: csv2table | .[0] as $headers | reduce (.[1:][] | select(length > 0) ) as $row ( []; . + [ $row|objectify($headers) ]);csv2json
Example (assuming csv.csv is the given CSV text file):
$ jq -R -s -f csv2json.jq csv.csv[ { "name": "john", "age": 20, "gender": "male" }, { "name": "jane", "age": 30, "gender": "female" }, { "name": "bob", "age": 25, "gender": "male" }]
with Miller (http://johnkerl.org/miller/doc/) is very simple. Using this input.csv file
name,age,genderjohn,20,malejane,30,femalebob,25,male
and running
mlr --c2j --jlistwrap cat input.csv
You will have
[{ "name": "john", "age": 20, "gender": "male" },{ "name": "jane", "age": 30, "gender": "female" },{ "name": "bob", "age": 25, "gender": "male" }]
As of 2018, a modern no code solution would be to use Python tool csvkit
has csvjson data.csv > data.json
.
See their documentation https://csvkit.readthedocs.io/en/1.0.2/
The toolkit is also very handy and complementary to jq
if your script has to debug both csv
and json
formats.
You might also want to check a powerful tool called visidata. Here is a screencast case study that is similar to the original poster's. You can also generate script from visidata