如何用Miller mlr或jq将JSON数组转换为Datagraph兼容格式
用jq/mlr一行命令转换JSON为Datagraph兼容格式
方案一:生成Datagraph原生支持的长表数组格式
使用jq命令
jq -n 'input | to_entries[] | .key as $pair | .value | range(0; .x | length) | {"pair": $pair, "x": .x[.], "y": .y[.]}' input.json
命令说明:
to_entries[]:把顶层的交易对(如btcusd)和对应的x/y数据拆成键值条目.key as $pair:暂存当前交易对的名称,后续生成条目时复用range(0; .x | length):遍历x数组的每一个索引位置- 对每个索引生成包含交易对名称、对应x值和y值的独立对象
输出示例:
[ {"pair": "btcusd", "x": 1254700800000, "y": 0.00076394}, {"pair": "btcusd", "x": 1254787200000, "y": 0.00076394}, {"pair": "btcusd", "x": 1254873600000, "y": 0.00088456}, {"pair": "btcusd", "x": 1730419200000, "y": 69513.1578978095}, {"pair": "xaubtc", "x": 1254700800000, "y": 1316202.8431552218}, {"pair": "xaubtc", "x": 1254787200000, "y": 1359727.2037070976}, {"pair": "xaubtc", "x": 1254873600000, "y": 1176008.410961382}, {"pair": "xaubtc", "x": 1719446400000, "y": 0.037321851310868535} ]
使用mlr命令
mlr --j2j put 'foreach (key, value in $*) { emit({"pair": key, "x": value.x, "y": value.y}) }' then unsparsify then expand -f x,y input.json
命令说明:
foreach (key, value in $*):遍历所有顶层交易对,发射包含交易对名称、x数组、y数组的条目unsparsify:确保所有字段统一存在,避免缺失值问题expand -f x,y:把x和y数组按索引展开为多行,每行对应一组x/y值
方案二:生成更直观的宽表格式
使用jq + mlr生成表格
jq -n 'input | to_entries | .[0] as $a | .[1] as $b | range(0; ($a.value.x | length) // ($b.value.x | length)) | {pair1: $a.key, x1: $a.value.x[.], y1: $a.value.y[.], pair2: $b.key, x2: $b.value.x[.], y2: $b.value.y[.]}' input.json | mlr --j2p cat
命令说明:
to_entries:把顶层键值对转为条目数组,方便分别获取两个交易对的数据- 暂存两个交易对的数据到
$a和$b,遍历索引范围(取两个数组长度的最小值) - 每个索引对应生成包含两个交易对x/y值的对象,最后用mlr转为易读的表格格式
输出示例:
pair1 x1 y1 pair2 x2 y2 btcusd 1254700800000 0.00076394 xaubtc 1254700800000 1316202.8431552218 btcusd 1254787200000 0.00076394 xaubtc 1254787200000 1359727.2037070976 btcusd 1254873600000 0.00088456 xaubtc 1254873600000 1176008.410961382 btcusd 1730419200000 69513.1578978095 xaubtc 1719446400000 0.037321851310868535
使用mlr单行命令
mlr --j2j put 'foreach (key, value in $*) { for (i in 0:length(value.x)-1) { emit({"index": i, "pair": key, "x": value.x[i], "y": value.y[i]}) } }' then pivot -i index -o pair -v x,y then rename -r '(.*)_x', '$1_x' then rename -r '(.*)_y', '$1_y' then remove -f index input.json | mlr --j2p cat
命令说明:
- 先遍历每个交易对,为每组x/y值添加索引字段,生成带索引的长表条目
pivot -i index -o pair -v x,y:按索引分组,把不同交易对的x/y转为宽表字段- 重命名字段为
pair1_x、pair1_y格式,最后移除索引字段并转为表格
内容的提问来源于stack exchange,提问作者Magic Thighs
相关产品推荐
相关产品推荐

