2017-07-31 4 views
-1

Je recherche actuellement une solution pour fusionner plusieurs (3-4) tableaux en fonction de plusieurs clés "index".JQ: Fusionner plusieurs tableaux json sur la clé d'index

Exemple Tableau 1:

{"Fan":[{ "Last Name":Mueller,"Firstname":Martin,"Adress":Madisson Square,"City":"New York","DegreesIndex":3,"SchoolIndex2":1,}] 

DegreesIndex et Schoolindex se réfère à deux clés différentes dans deux autres tableaux:

exemple Array 2:

{"Degrees":[ 
{"DegreesIndex":3, 
"Key":"12759303, 
"Degrees":1.6}]} 

exemple Tableau 3:

{"École": [ {"SchoolIndex": 1, "Teaser": "12759303.8, " Trainer ": Miller}]}

Comment puis-je fusionner des tableaux basés sur les clés" index "avec JQ 1.5 sous windows10?

Cordialement Timo

+1

1. Veuillez corriger le JSON. 2. S'il vous plaît clarifier la question après avoir examiné les lignes directrices à http://stackoverflow.com/help/mcve – peak

Répondre

1

Je crois que cela peut être proche de ce que vous cherchez:

# input: an object 
def merge_by_index(obj; ix): 
    ix as $index 
    | . + (obj | map(select(ix == $index)) [0]) 
    | del(ix) ; 

Après le nettoyage de votre entrée de l'échantillon, et en supposant a1, a2 et a3 sont les trois objets de niveau supérieur:

a1 
| .Fan[0] |= merge_by_index(a2|.Degrees; .DegreesIndex) 
| .Fan[0] |= merge_by_index(a3|.School; .SchoolIndex) 

produit:

{ 
    "Fan": [ 
    { 
     "Last Name": "Mueller", 
     "Firstname": "Martin", 
     "Adress": "Madisson Square", 
     "City": "New York", 
     "Key": 12759303, 
     "Degrees": 1.6, 
     "Teaser": 12759303.8, 
     "Trainer": "Miller" 
    } 
    ] 
} 
0

Voici comment j'aborderais cela. C'est un peu plus verbeux que l'approche de peak.

Définissez d'abord quelques tableaux avec les données. Notez que j'ai pris la liberté d'ajouter une autre entrée pour tester ce qui se passe quand il n'y a pas de correspondance DegreesIndex ou SchoolIndex pour le donné Fan. J'aime utiliser les fonctions ici parce que vous pouvez facilement les remplacer par la logique dont vous avez besoin pour obtenir vos données réelles.

def array1: { 
    "Fan": [ 
    { 
     "Last Name":"Mueller", "First Name":"Martin", 
     "Address": "Madisson Square", "City": "New York", 
     "DegreesIndex": 3, "SchoolIndex": 1 
    }, 
    { 
     "Last Name":"Roberts", "First Name":"Bob", 
     "DegreesIndex": 2, "SchoolIndex": 4 
    }, 
    { 
     "Last Name":"Skywalker", "First Name":"Luke", 
     "DegreesIndex": 5, "SchoolIndex": 1 
    } 
    ]}; 

def array2: { 
"Degrees": [ 
    { "DegreesIndex":3, "Key": "12759303", "Degrees":1.6 }, 
    { "DegreesIndex":2, "Key": "2",  "Degrees":2 } 
    ]}; 

def array3: { 
    "School": [ 
    { "SchoolIndex":1, "Teaser":"12759303.8", "Trainer":"Miller" }, 
    { "SchoolIndex":2, "Teaser":"2",   "Trainer":"Miller" } 
    ]}; 

Maintenant, définissez quelques fonctions de recherche simples qui retourneront l'enregistrement correspondant à la clé spécifiée. Notez l'utilisation de la construction [...] [0] pour renvoyer une valeur nulle si l'élément n'est pas trouvé au lieu de provoquer entièrement le Fan.

def LookupDegrees($i): 
    [ 
     array2 
    | .Degrees[] 
    | select(.DegreesIndex == $i) 
    ][0] 
; 

def LookupSchool($i): 
    [ 
     array3 
    | .School[] 
    | select(.SchoolIndex == $i) 
    ][0] 
; 

Tout ce qui rend simple routine principale:

array1 
| .Fan[] 
| .Degrees = LookupDegrees(.DegreesIndex) 
| .School = LookupSchool(.SchoolIndex) 

Voici le résultat que je reçois quand je lance avec JQ -n -f file.jq

{ 
    "Last Name": "Mueller", 
    "First Name": "Martin", 
    "Address": "Madisson Square", 
    "City": "New York", 
    "DegreesIndex": 3, 
    "SchoolIndex": 1, 
    "Degrees": { 
    "DegreesIndex": 3, 
    "Key": "12759303", 
    "Degrees": 1.6 
    }, 
    "School": { 
    "SchoolIndex": 1, 
    "Teaser": "12759303.8", 
    "Trainer": "Miller" 
    } 
} 
{ 
    "Last Name": "Roberts", 
    "First Name": "Bob", 
    "DegreesIndex": 2, 
    "SchoolIndex": 4, 
    "Degrees": { 
    "DegreesIndex": 2, 
    "Key": "2", 
    "Degrees": 2 
    }, 
    "School": null 
} 
{ 
    "Last Name": "Skywalker", 
    "First Name": "Luke", 
    "DegreesIndex": 5, 
    "SchoolIndex": 1, 
    "Degrees": null, 
    "School": { 
    "SchoolIndex": 1, 
    "Teaser": "12759303.8", 
    "Trainer": "Miller" 
    } 
} 

Cela devrait Soyez facile à ajuster si vous avez besoin d'une imbrication ou d'une sortie différente.