CSVに変換したいJSONドキュメントがあります。 1回の繰り返しで、最初、2番目、3番目の列(文字列または配列のいずれか)を繰り返す必要があります。
サンプル文書:
[
{
"results": [
[
"abc025",
"true",
"test.lun"
],
[
"xyz025",
[
"true",
"false",
"true"
],
[
"product.lun",
"app.lun",
"ora.lun"
]
]
]
}
]
予想CSV:
"abc025","true","test.lun"
"xyz025","true","product.lun"
"xyz025","false","app.lun"
"xyz025","true","ora.lun"
ベストアンサー1
jq
式の使用
.[].results[] | .[0] as $name | .[1:] | map([.[]]? // [.]) |
(.[0]|keys[]) as $i | [ $name, .[][$i] ] | @csv
ここで、最初の行は各個々のサブ配列(それぞれ別々の反復)から最初の要素()を選択し、各サブ配列$name
()の残りのデータを列ごとに1つの配列を持つ配列に変換します。.[0]
abc025
xyz025
.[1:]
[["true"],["test.lun"]]
[["true","false","true"],["product.lun","app.lun","ora.lun"]]
これは、map()
各要素が配列に抽出される呼び出しで行われます。これがうまくいかない場合、要素は次のようになります。投資するソート。したがって、各要素は配列として保持されるか、単一要素の配列に変換されます。
2行目は、これらの列配列のインデックスを繰り返し、出力をCSVとして生成します。
テスト:
$ jq -r '.[].results[] | .[0] as $name | .[1:] | map([.[]]? // [.]) | (.[0]|keys[]) as $i | [ $name, .[][$i] ] | @csv' file
"abc025","true","test.lun"
"xyz025","true","product.lun"
"xyz025","false","app.lun"
"xyz025","true","ora.lun"
一般化ですので参考にしてください以前の問題に対する私の解決策。この質問のデータと共にこのコードを使用することもできます。
列が3つ以上のデータにもこの方法を使用できます。文書
[
{
"results": [
[ "abc025",
"true",
"test.lun",
"blueberry" ],
[ "xyz025",
["true","false","true"],
["product.lun","app.lun","ora.lun"],
["strawberry","cloudberry","lingonberry"] ]
]
}
]
に変換されます
"abc025","true","test.lun","blueberry"
"xyz025","true","product.lun","strawberry"
"xyz025","false","app.lun","cloudberry"
"xyz025","true","ora.lun","lingonberry"