2014-10-31 2 views
0

Songkick의 JSON API for local events에서 정보를 분석하기 위해 관계형 데이터베이스를 사용하고 싶습니다.중복 객체를 만들지 않고이 객체 스트림을 병합하려면 어떻게해야합니까?

이벤트 객체는 복잡하고 깊이 중첩되어 있으므로 이벤트 객체를 필터링하고 병합하여 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" 
    } 
} 

다음 성능 목록에서 각 개체에 대해 하나의 출력 개체를 생성하려고합니다. 이러한 새 객체에는 날짜 및 장소와 같은 포함 이벤트 객체의 속성이 있어야합니다.

예제의 올바른 결과는 다음과 같습니다.

{ 
    "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에서 올바른 방법은 무엇입니까? 필드가 동일한 순서에없는 있지만

.resultsPage.results.event | map(
    { 
     venue_name: .venue.displayName, 
     start_date: .start.date 
    } 
    + 
    (.performance[].artist | { 
     artist_mbid: .identifier[].mbid, 
     artist_name: .displayName 
    }) 
) 

을하지만, 필요한 경우 당신은 항상 순서를 변경할 수 :

답변

1

이 필터는 작업을해야

[ 
    { 
    "venue_name": "Live At The Star", 
    "start_date": "2014-10-28", 
    "artist_mbid": "08e5954e-efc0-4a95-95ac-d74cca5b79ff", 
    "artist_name": "James Keelaghan" 
    }, 
    { 
    "venue_name": "O2 ABC", 
    "start_date": "2014-10-28", 
    "artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57", 
    "artist_name": "Katy B" 
    }, 
    { 
    "venue_name": "O2 ABC", 
    "start_date": "2014-10-28", 
    "artist_mbid": "27bc6f5b-4585-49ab-8d7d-c62b59f5f010", 
    "artist_name": "Becky Hill" 
    } 
] 

을 당신은 객체를 생성하기 위해 노력하고 모든 해당 performance에 해당하므로 결과를 수집하기 전에 조금씩 병합해야합니다.

+0

여러 개의. [] 필터를 사용할 때주의해야 할 사항. 각 배열에 대해 둘 이상의 값이있는 경우 배열의 각 값 조합에 대한 결과가 생성됩니다. 이는 원하는 것이 아닐 수 있습니다. –

+0

감사합니다. 나는 실제로 그 물체들이 복제물 이라기보다는 순열 들임을 알지 못했다. 또 다른 중요한 학습 포인트는 목록을 보존하면서 반복적으로 필터를 적용하기 위해'map '을 사용하는 것입니다. –