CSV to JSON using jq CSV to JSON using jq json json

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