2017-06-26 13 views
0

ある配列にあるキー値をいくつか取り、その値を別の配列に対応させたいとします。参考までに私はjq-1.5を使用していますjq 1.5:1つの配列のキーを別の配列にある値と組み合わせる

私はいくつかの株データを取得しているquandl APIからいくつかのデータを得ました。たとえば、次のコードはいくつかのjsonデータをプルダウンします。

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

データIは、冗長データの一部を削除したものの、次のようです。私は.datatable.columnsから「キー」と一致しているよ

{ 
    "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 
    } 
} 

[$インデックス1] .datatable.dataで「値」を持つ.nameの[1]というように、各反復インデックス値を持ちます。私は次のような出力を得るために探しています。

[ 
    { 
    "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 
    } 
] 

は、これまでのところ私は、インデックスをカウントアップのアイデアを周りにプレイしましたが、私のソリューションのほとんどは、これまでかなり冗長ていた、と私は/ AWKなどのsedするJQのステップアウト自分を見つけています私が想像していることはjqで簡単です。

答えて

2

ここでは、ソリューションを理解しやすくするためのヘルパ関数を示します。

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

溶液は今簡単である:それはheadersキー名として使用される文字列の配列であると仮定して、オブジェクトに入力配列を変換

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

パイソンソリューション:

combine_keys.pyスクリプト:

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) 

使用

python combine_keys.py input.json 

出力:

[ 
    { 
     "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 
    } 
] 
関連する問題