2017-06-26 6 views
0

Ich möchte einige Schlüsselwerte, die in einem Array gefunden werden, und sie mit ihren entsprechenden Werten in einem anderen Array übereinstimmen. Als Referenz benutze ich jq-1.5jq 1.5: Kombinieren von Schlüsseln aus einem Array mit ihren Werten, die in einem anderen Array sind

Ich habe ein paar Daten von der quandl api, wo ich einige Aktien Daten ziehen. Im Folgenden werden beispielsweise einige json-Daten abgerufen.

curl https://www.quandl.com/api/v3/datatables/WIKI/PRICES.json?ticker=FB&qopts.columns=date,close,high,low&api_key=myapikeyblahblah

Die Daten sind wie folgt, obwohl ich einige der redundanten Daten entfernt haben;

{ 
    "datatable": { 
    "data": [ 
     ["2012-05-18", 38.2318, 45.0, 38.0], 
     ["2012-05-21", 34.03, 36.66, 33.0], 
     ["2012-05-22", 31.0, 33.59, 30.94], 
     ["2017-06-22", 153.4, 154.55, 152.91], 
     ["2017-06-23", 155.07, 155.2, 152.65] 
    ], 
    "columns": [{ 
     "name": "date", 
     "type": "Date" 
    }, { 
     "name": "close", 
     "type": "BigDecimal(34,12)" 
    }, { 
     "name": "high", 
     "type": "BigDecimal(34,12)" 
    }, { 
     "name": "low", 
     "type": "BigDecimal(34,12)" 
    }] 
    }, 
    "meta": { 
    "next_cursor_id": null 
    } 
} 

Ich suche die „Schlüssel“ von den .datatable.columns [$ index1] .name mit den „Werten“ in .datatable.data [1] und so weiter mit jeder Iteration Indexwert entsprechen . Ich suche nach einer Ausgabe wie folgt;

[ 
    { 
    "date": "2012-05-18", 
    "close": 38.2318, 
    "high": 45.0, 
    "low": 38.0 
    }, 
    { 
    "date": "2012-05-21", 
    "close": 34.03, 
    "high": 36.66, 
    "low": 33.0 
    }, 
    { 
    "date": "2012-05-22", 
    "close": 31.0, 
    "high": 33.59, 
    "low": 30.94 
    }, 
    { 
    "date": "2017-06-22", 
    "close": 153.4, 
    "high": 154.55, 
    "low": 152.91 
    }, 
    { 
    "date": "2017-06-23", 
    "close": 155.07, 
    "high": 155.2, 
    "low": 152.65 
    } 
] 

Bisher habe ich mit dem Gedanken, Zählen den Index rumgespielt, aber die meisten meiner Lösungen bisher habe ziemlich ausführliche gewesen, und ich selbst bin der Suche aus jq Schritt sed/awk usw. für etwas, das ich mir vorstelle, ist einfach in jq.

Antwort

2

Hier ist eine Hilfsfunktion, um die Lösung einfach zu verstehen. Er wandelt die Eingangsanordnung zu einem Objekt, unter der Annahme, dass headers ist ein Array von Zeichenketten als Schlüsselnamen verwendet werden:

def objectify(headers): 
    [headers, .] | transpose | map({ (.[0]): .[1] }) | add; 

Eine Lösung ist jetzt einfach:

.datatable 
| (.columns | map(.name)) as $headers 
| .data 
| map(objectify($headers)) 
0

Python Lösung:

combine_keys.py Skript:

import sys, json 

data = json.load(open(sys.argv[1], 'r')) 
columns = [o['name'] for o in data['datatable']['columns']] 
result = json.dumps([dict(zip(columns, i)) for i in data['datatable']['data']], indent=4) 
print(result) 

Nutzungs:

python combine_keys.py input.json 

Der Ausgang:

[ 
    { 
     "low": 38.0, 
     "date": "2012-05-18", 
     "close": 38.2318, 
     "high": 45.0 
    }, 
    { 
     "low": 33.0, 
     "date": "2012-05-21", 
     "close": 34.03, 
     "high": 36.66 
    }, 
    { 
     "low": 30.94, 
     "date": "2012-05-22", 
     "close": 31.0, 
     "high": 33.59 
    }, 
    { 
     "low": 152.91, 
     "date": "2017-06-22", 
     "close": 153.4, 
     "high": 154.55 
    }, 
    { 
     "low": 152.65, 
     "date": "2017-06-23", 
     "close": 155.07, 
     "high": 155.2 
    } 
] 
Verwandte Themen