web-dev-qa-db-ja.com

オブジェクトをcsvに変換できるように配列にマッピングする方法は?

私はこのようなオブジェクトを変換しようとしています:

{
  "123" : "abc",
  "231" : "dbh",
  "452" : "xyz"
}

次のようなcsvへ:

"123","abc"
"231","dbh"
"452","xyz"

コマンドラインツール jq を使用したいと思いますが、割り当ての方法がわからないようです。私はjq '. | keys' test.jsonでキーを取得できましたが、次に何をすべきかわかりませんでした。

問題は、このようなk:vオブジェクトを@csvで直接csvに変換できないことです。配列である必要があるため、最初に配列に変換する必要があります。キーに名前が付けられている場合、それは単純ですが、動的であるためそれほど簡単ではありません。

29
Louis

このフィルターを試してください:

to_entries[] | [.key, .value]
  • to_entriesは、オブジェクトをキー/値オブジェクトの配列に変換します。 []は、配列を配列内の各アイテムに分割します
  • 次に、各アイテムについて、キーと値を含む配列に変換します。

これにより、次の出力が生成されます。

[
  "123",
  "abc"
],
[
  "231",
  "dbh"
],
[
  "452",
  "xyz"
]

次に、@csvフィルタを使用して、行をCSV行に変換します。

$ echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries[] | [.key, .value] | @csv'
"123","abc"
"231","dbh"
"452","xyz"
43
Jeff Mercado

これが私が今朝使用することになった例です(PagerDutyアラートの処理):

cat /tmp/summary.json | jq -r '
  .incidents
  | map({desc: .trigger_summary_data.description, id:.id})
  | group_by(.desc)
  | map(length as $len
  | {desc:.[0].desc, length: $len}) 
  | sort_by(.length) 
  | map([.desc, .length] | @csv)
  | join("\n") '

次のようなCVSで区切られたドキュメントをダンプします:"[Triggered] Something annoyingly frequent",31 "[Triggered] Even more frequent alert!",35 "[No data] Stats Server is probably acting up",55

4
Jón Tómas

ジェフの答えは良い出発点であり、あなたが期待するものに近いものです:

cat input.json | jq 'to_entries | map([.key, .value]|join(","))'

[
 "123,abc",
 "231,dbh",
 "452,xyz"
]

しかし、改行を使用して参加する方法が見つかりませんでした:

cat input.json | jq 'to_entries | map([.key, .value]|join(","))|join("\n")'

"123,abc\n231,dbh\n452,xyz"
3
tomsoft

これを試してくださいあなたが望む同じ出力を与える

echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries | .[] | "\"" + .key + "\",\"" + (.value | tostring)+ "\""'
0
Sunil shakya