How to transform valid JSON to CSV?
I'm trying to extract information from a JSON file and write some of the contents to a CSV file.
Here is an example of my text
"data":{"headers":{"sender":"[email protected]"
"to":"[email protected]"
"subject":"Help with this project"
"x-received-time":"14144273245408"
"received":"from abc.com ()\r\n by mail.mail.com with SMTP (Postfix)\r\n for [email protected];\r\n Mon
"from":"\"Help with this project\" <[email protected]>"
"date":"Mon, 27 Oct 2014 09:03:14 -0500"
"id":"1414427328-2345855-frank"
"to":"[email protected]"
"time":14144273245408
"subject":"Help with this project"
"fromfull":"[email protected]"
I want to grab the contents from: to, fromfull, id, subject, date and write it to a csv file where To is column A, fromfull is column B, and so forth.
Can anyone offer any assistance? This is a JSON response.
You can convert this JSON to CSV in a single line with jq
.
jq '.data.headers | [.sender, .to, .subject, ."x-received-time",
.received, .from, .date, .id, .to, .subject, .fromfull]
+ [(.time | tostring)] | join(", ")'
Breakdown:
-
.data.headers
- Emit headers as an object- If data contained an array of headers it would be
.data[].headers
- If data contained an array of headers it would be
-
[…string keys list…]
- Emit string values as an array -
+ [(.time | tostring)]
- Emit time as a string and add to the array -
join(", ")
- Join the array values using a comma and a space- Substitute your favorite delimiter here
You can use the following perl command to create the CSV output, open a terminal and type:
perl -n0e '@a= $_ =~ /"date":(".*?").*?"id":(".*?").*?"to":"(.*?)".*?".*?"subject":(".*?").*?"fromfull":"(.*?)"/gs; while (my @next_n = splice @a, 0, 5) { print join(q{,}, @next_n)."\n"}' inputfile.txt
It will work even if you have multiple headers in your input file.
Note that only the last "to": field is taken into account (it seems that your headers provide the info twice)
The command output:
"Mon, 27 Oct 2014 09:03:14 -0500","1414427328-2345855-frank",[email protected],"Help with this project",[email protected]