Saya memiliki file JSON di bawah ini:
{
"data": [
{
"displayName": "First Name",
"rank": 1,
"value": "VALUE"
},
{
"displayName": "Last Name",
"rank": 2,
"value": "VALUE"
},
{
"displayName": "Position",
"rank": 3,
"value": "VALUE"
},
{
"displayName": "Company Name",
"rank": 4,
"value": "VALUE"
},
{
"displayName": "Country",
"rank": 5,
"value": "VALUE"
},
]
}
Saya ingin memiliki file CSV dalam format ini:
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE
Apakah ini mungkin hanya dengan menggunakan jq
? Saya tidak memiliki keterampilan pemrograman.
Jawaban:
jq memiliki filter, @csv, untuk mengonversi array ke string CSV. Filter ini memperhitungkan sebagian besar kompleksitas yang terkait dengan format CSV, dimulai dengan koma yang tertanam di bidang. (jq 1.5 memiliki filter serupa, @tsv, untuk menghasilkan file nilai yang dipisahkan-tab.)
Tentu saja, jika tajuk dan nilai semuanya dijamin bebas dari koma dan tanda kutip ganda, maka mungkin tidak perlu menggunakan filter @csv. Kalau tidak, mungkin akan lebih baik menggunakannya.
Misalnya, jika 'Nama Perusahaan' adalah 'Smith, Smith dan Smith', dan jika nilai-nilai lain seperti yang ditunjukkan di bawah ini, memohon jq dengan opsi "-r" akan menghasilkan CSV yang valid:
sumber
Saya lebih suka membuat setiap rekaman satu baris di CSV saya.
sumber
.value|tostring
bukannya.value
pada contoh di atas(.value|tostring)
jq -r
untuk menghapus tanda kutipDiberi hanya file ini, Anda dapat melakukan sesuatu seperti:
The
.
Operator memilih field dari obyek / hash. Jadi, kita mulai dengan.data
, yang mengembalikan array dengan data di dalamnya. Kami kemudian memetakan array dua kali, pertama memilih displayName, lalu memilih nilai, memberi kami dua array hanya dengan nilai-nilai kunci tersebut. Untuk setiap array, kita gabungkan elemen dengan "," membentuk dua garis. The-r
Argumen mengatakanjq
untuk tidak mengutip string yang dihasilkan.Jika file Anda yang sebenarnya lebih panjang (yaitu, memiliki entri untuk lebih dari satu orang), Anda mungkin perlu sesuatu yang sedikit lebih rumit.
sumber
Saya merasa
jq
sulit untuk membungkus kepala saya. Ini beberapa Ruby:Parser JSON ruby muntah tentang koma trailing sebelum tanda kurung tutup.
sumber
Karena Anda menandai ini
python
dan dengan asumsi namajson
filex.json
sumber
Meskipun saya harus menghapus koma terakhir dalam contoh input Anda untuk membuatnya berfungsi karena
jq
mengeluh tentang mengharapkan elemen array lain, ini:... menangkapku ...
Singkatnya cara kerjanya:
[]
formulir bidang kosong dan.dot
notasi indeks ..[][].displayName
.[.[][].displayName], [.[][].value]
join(", ")
fungsi yang akan digabungkan sebagai entitas yang terpisah.Sebenarnya melakukan
[.field]
hanyalah cara lain untukmap(.field)
tetapi ini sedikit lebih spesifik karena ia menentukan tingkat kedalaman untuk mengambil data yang diinginkan.sumber