Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I convert my JSON to CSV using jq?

Tags:

json

shell

csv

perl

jq

I have the following JSON data:

{"id":"111","case":"Y","custom":{"speech invoked":"no","input method":"hard","session ID":"420"}}

How can I convert it to CSV format using jq so my result looks like this?

id,case,session Id,speech invoked,input method

111,Y,420,no,hard

I tried the following, but it didn't work:

{(.id),(.case),(.custom."session Id"),(.custom."speech invoked"),(.custom."input method")}

If not possible any perl or shell solution is appreciated.

like image 736
user2711819 Avatar asked Aug 28 '14 21:08

user2711819


People also ask

Is it easy to convert JSON to CSV?

As mentioned in the previous answers the difficulty in converting json to csv is because a json file can contain nested dictionaries and therefore be a multidimensional data structure verses a csv which is a 2D data structure.


2 Answers

Building upon Joe Harris' answer, you can use the @csv filter so that strings are properly quoted and escaped when necessary :

jq -r '[.case, .custom."speech invoked", .custom."input method"] | @csv'
like image 143
Olivier Aubert Avatar answered Oct 10 '22 09:10

Olivier Aubert


Using perl wasn't a good solution for me but after a bit of trial and error I figured out you can do it with just jq using the join() operator.

First make an array of the output you need, then join the array elements using commas.

jq -r '[.case, .custom."speech invoked", .custom."input method"] | join(", ")'

Enjoy. :)

like image 44
Joe Harris Avatar answered Oct 10 '22 09:10

Joe Harris