JSON 檔案如下所示:
{
"name": "My Collection",
"description": "This is a great collection.",
"date": 1639717379161,
"attributes": [
{
"trait_type": "Background",
"value": "Sand"
},
{
"trait_type": "Skin",
"value": "Dark Brown"
},
{
"trait_type": "Mouth",
"value": "Smile Basic"
},
{
"trait_type": "Eyes",
"value": "Confused"
}
]
}
我找到了一個使用jq并具有以下代碼的shell腳本:
i=1
for eachFile in *.json; do
cat $i.json | jq -r '.[] | {column1: .name, column2: .description} | [.[] | tostring] | @csv' > extract-$i.csv
echo "converted $i of many json files..."
((i=i 1))
done
但它的輸出是:
jq: error (at <stdin>:34): Cannot index string with string "name"
converted 1 of many json files...
關于如何進行這項作業的任何建議?謝謝!
uj5u.com熱心網友回復:
快速jq課
==========
jq 過濾器是這樣應用的:
jq -r '.name_of_json_field_0 <optional filter>, .name_of_json_field_1 <optional filter>'
等等等等。單點是最簡單的過濾器;它使資料欄位保持不變。
jq -r '.name_of_field .'
您也可以保持過濾器欄位不變以獲得相同的效果。在您的情況下:
jq -r '.name, .description'
將提取這兩個欄位的值。
.[]將解包一個陣列,將下一個管道過濾器應用于每個解包的值。示例:
jq -r '.attributes | .[]
提取所有 trait_types 物件。
有時您可能希望通過將過濾器括在括號中來重新打包陣列中的物件:
jq -r '[.name, .description, .date]
有時您可能希望通過將過濾器括在花括號中來重新打包物件中的資料:
`jq -r '{new_field_name: .name, super_new_field_name: .description}'
玩這些,我能夠得到
jq -r '[.name, .description, .date, (.attributes | [.[] | .trait_type] | @csv | gsub(",";";") | gsub("\"";"")), (.attributes | [.[] | .value] | .[]] | @csv | gsub(",";";") | gsub("\"";""))] | @csv'
給我們:
"My Collection","This is a great collection.",1639717379161,"Background;Skin;Mouth;Eyes","Sand;Dark Brown;Smile Basic;Confused"
名稱、描述和日期保持原樣,所以讓我們一步一步地分解奇怪的部分。
.attributes | [.[] | .trait_type]
.[]提取屬性陣列的每個元素,并將其結果通過管道傳送到下一個過濾器,它說簡單地提取trait_type,在那里它們被重新打包在一個陣列中。
.attributes | [.[] | .trait_type] | @csv
將陣列轉換為 csv 可決議格式。
(.attributes | [.[] | .trait_type] | @csv | gsub(",";";") | gsub("\"";""))
顯然,父母將其與其他評估分開。gsub這里的第一個用分號替換逗號,因此它們不會被解釋為單獨的欄位,第二個洗掉所有額外的雙引號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/386275.html
