Soru Bir nesneyi csv'ye dönüştürülebilmesi için diziler nasıl eşleştirilir?


Şuna benzeyen bir nesneyi dönüştürmeye çalışıyorum:

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

Buna benzeyen csv'ye:

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

Komut satırı aracını kullanmayı tercih ederim jq ancak ödevi nasıl yapacağını anlayamıyorum. Anahtarları almayı başardım jq '. | keys' test.json ama sonra ne yapacağımı anlayamadım.

Sorun şu ki bir k: v nesnesini csv ile csv'ye dönüştürebilirsiniz @csv. Bir dizi olması gerekiyor, bu yüzden önce bir diziye dönüştürmemiz gerekiyor. Anahtarlar adlandırılmışsa, bu basit olurdu, ancak dinamikler, o kadar kolay değil.


21
2017-11-24 21:49


Menşei


Neden sadece 'gsub' değil: '?'? - Mike Manfrin
Google JSON to csv ... çok sayıda sonuç - charlietfl


Cevaplar:


Bu filtreyi deneyin:

to_entries[] | [.key, .value]
  • to_entries bir nesneyi bir anahtar / değer nesnesi dizisine dönüştürür. [] Dizideki öğelerin her birine diziyi ayırır
  • Daha sonra her bir öğe için, anahtar ve değeri içeren bir diziye gizleyin.

Bu, aşağıdaki çıktıyı üretir:

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

Sonra kullanabilirsiniz @csv satırları CSV satırlarına dönüştürmek için süzgeç.

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

28
2018-06-17 01:11



Hmm. Benim için bu geri "\"123\",\"abc\"" vb. her satır ayrıca alıntılanır. - Konrad Rudolph
Eklediğinizden emin olun -r çağrıya bayrak. Ham çıktıyı almak isteyeceksiniz. - Jeff Mercado
Teşekkürler, bunu gözden kaçırmıştım. - Konrad Rudolph


İşte bu sabah kullanarak sona erdi bir örnek (PagerDuty uyarıları işleme):

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") '

Bu, aşağıdaki gibi görünen CVS ayrılmış bir dökümanın dökümünü yapar: "[Triggered] Something annoyingly frequent",31 "[Triggered] Even more frequent alert!",35 "[No data] Stats Server is probably acting up",55


3
2018-02-27 18:51





Jeff cevap, beklediğiniz şeylere daha yakın bir şey, iyi bir başlangıç ​​noktasıdır:

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

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

Ancak, yeni satır kullanmaya katılmanın bir yolunu bulamadınız:

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

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

1
2017-11-06 09:24



"\ n", yeni satırın JSON temsilidir; bir literal yeni hat olarak görmek için jq'nin -r komut-lline seçeneğini kullanın. Ancak, genel olarak, @csv CSV almak, @csv'nin gerçekten geçerli bir CSV ürettiği gibi gitmenin daha iyi bir yoludur. - peak


Bunu dene istediğin aynı çıktıyı ver

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

0
2018-05-15 11:15





onecol2txt () {
 awk 'BEGIN { RS="_end_"; FS="\n"}
   { for (i=2; i <= NF; i++){
       printf "%s ",$i 
       }
     printf "\n" 
   }'
}
cat jsonfile | jq -r -c '....,"_end_"' | onecol2txt

-3
2018-06-19 12:41