我想获取一个数组中的一些键值,并将它们与不同数组中的相应值匹配。作为参考我正在使用jq-1.5
我从quandl api获得了一些数据,我正在提取一些股票数据。例如,以下内容会删除一些json数据。
数据如下,虽然我删除了一些冗余数据;
{
"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
}
}
我希望将.datatable.columns [$ index1] .name中的“键”与.datatable.data [1]中的“values”匹配,依此类推每个迭代索引值。我希望获得如下输出;
[
{
"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
}
]
到目前为止,我已经开始使用计算索引的想法,但到目前为止,我的大多数解决方案都相当冗长,而且我发现自己走出了jq到sed / awk等等。想象在jq很容易。
答案 0 :(得分:3)
这是一个帮助函数,使解决方案易于理解。它将输入数组转换为对象,假设headers
是要用作键名的字符串数组:
def objectify(headers):
[headers, .] | transpose | map( { (.[0]): .[1] } ) | add;
解决方案现在很简单:
.datatable
| (.columns | map(.name)) as $headers
| .data
| map( objectify($headers) )
答案 1 :(得分:0)
Python 解决方案:
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
}
]