リレーショナル データベースを使用して、ローカル イベントの Songkick の JSON APIからの情報を分析したいと考えています。
のイベント オブジェクトは複雑で深くネストされているため、イベント オブジェクトをフィルター処理して平坦化し、CSV に変換して、標準ツールで読み込めるようにしたいと考えています。
jq を使用してイベントをフィルタリングおよびフラット化できますか?
API からの一般的な応答は大きすぎてここには表示できません。同じ相対構造を持つ単純化されたバージョンを示します。
フィルター.resultsPage.results.event[]
を応答に適用すると、このようなイベント オブジェクトのストリームが生成されます。
{
"start": {
"date": "2014-10-28"
},
"performance": [
{
"artist": {
"displayName": "James Keelaghan",
"identifier": [
{
"mbid": "08e5954e-efc0-4a95-95ac-d74cca5b79ff"
}
]
}
}
],
"venue": {
"displayName": "Live At The Star"
}
}
{
"start": {
"date": "2014-10-28"
},
"performance": [
{
"artist": {
"displayName": "Katy B",
"identifier": [
{
"mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57"
}
]
}
},
{
"artist": {
"displayName": "Becky Hill",
"identifier": [
{
"mbid": "27bc6f5b-4585-49ab-8d7d-c62b59f5f010"
}
]
}
}
],
"venue": {
"displayName": "O2 ABC"
}
}
次に、パフォーマンス リスト内のオブジェクトごとに 1 つの出力オブジェクトを生成します。これらの新しいオブジェクトには、日付や会場など、含まれているイベント オブジェクトの属性が必要です。
この例の正しい出力は次のようになります。
{
"venue_name": "Live At The Star",
"artist_mbid": "08e5954e-efc0-4a95-95ac-d74cca5b79ff",
"artist_name": "James Keelaghan",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57",
"artist_name": "Katy B",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57",
"artist_name": "Becky Hill",
"start_date": "2014-10-28"
}
mbid を無視すると、この jq フィルターで必要なものが得られます。
{
start_date: .start.date,
artist_name: .performance[].artist.displayName,
venue_name: .venue.displayName
}
結果はこんな感じ。
{
"venue_name": "Live At The Star",
"artist_name": "James Keelaghan",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_name": "Katy B",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_name": "Becky Hill",
"start_date": "2014-10-28"
}
このフィルターを試して、mbidも取得しました。
{
start_date: .start.date,
artist_name: .performance[].artist.displayName,
artist_mbid: .performance[].artist.identifier[].mbid,
venue_name: .venue.displayName
}
結果はこんな感じ。
{
"venue_name": "Live At The Star",
"artist_mbid": "08e5954e-efc0-4a95-95ac-d74cca5b79ff",
"artist_name": "James Keelaghan",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57",
"artist_name": "Katy B",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "27bc6f5b-4585-49ab-8d7d-c62b59f5f010",
"artist_name": "Katy B",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57",
"artist_name": "Becky Hill",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "27bc6f5b-4585-49ab-8d7d-c62b59f5f010",
"artist_name": "Becky Hill",
"start_date": "2014-10-28"
}
各オブジェクトは正しく見えますが、オブジェクトが多すぎます! 「Katy B」と「Becky Hill」のオブジェクトが複製されます。
jqでこれを行う正しい方法は何ですか?