Home > Net >  How to not let jq interpret the newline character when exporting to CSV
How to not let jq interpret the newline character when exporting to CSV

Time:11-24

I want to convert the following JSON content stored in a file tmp.json

{
    "results": [
        [
           {
               "field": "field1",
               "value": "value1-1"
           },
           {
               "field": "field2",
               "value": "value1-2\n"
           }
        ],
        [
           {
               "field": "field1",
               "value": "value2-1"
           },
           {
               "field": "field2",
               "value": "value2-2\n"
           }
        ]
    ]
}

into a CSV output

"field1","field2"
"value1-1","value1-2\n"
"value2-1","value2-2\n"

When I use this jq command, however,

 cat tmp.json | jq -r '.results | (first | map(.field)), (.[] | map(.value)) | @csv'

I get this result:

"field1","field2"
"value1-1","value1-2
"
"value2-1","value2-2
"

How should the jq command be written to get the desired CSV result?

CodePudding user response:

For a jq-only solution, you can use gsub("\n"; "\\n"). I'd go with something like this:

.results
| (.[0] | map(.field)),
  (.[]  | map( .value | gsub("\n"; "\\n")))
| @csv

Using your JSON and invoking this with the -r command line option yields:

"field1","field2"
"value1-1","value1-2\n"
"value2-1","value2-2\n"

CodePudding user response:

If newlines are the only thing you can handle, maybe you can do a string replacement.

cat tmp.json | jq -r '.results | (first | map(.field)), (.[] | map(.value) | map(gsub("\\n"; "\\n"))) | @csv'
  • Related