嵌套JSON转CSV:基于jq实现订单簿快照数据格式化需求
订单簿JSON转CSV的问题解决
需求梳理
一开始想把订单簿里的每条bid、ask记录拆成单独行,但现有jq脚本生成了多余空行;后来需求调整为只提取最高出价(bid)和最低要价(ask),生成单行无表头CSV,还要兼容bid或ask缺失的情况。
最终优化后的jq脚本
假设订单簿JSON结构如下(bids按价格降序、asks按价格升序排列,子数组格式为[价格, 数量]):
{ "bids": [["100.5", "2.0"], ["99.8", "5.0"]], "asks": [["101.2", "3.0"], ["101.5", "1.5"]] }
用以下脚本处理即可:
[ ( .bids[0] // ["", ""] ), ( .asks[0] // ["", ""] ) ] | flatten | @csv
脚本细节说明
.bids[0] // ["", ""]:直接取第一个bid(也就是最高出价),如果bids数组为空或者不存在,就用空字符串占位.asks[0] // ["", ""]:同理,取第一个ask(最低要价),缺失时用空字符串补位flatten:把嵌套的数组展开成一维结构,方便转CSV@csv:将数组直接格式化为无表头的CSV行
测试验证
- 完整数据场景:
输入示例JSON,输出:
"100.5","2.0","101.2","3.0"
- 缺失bids场景:
输入:
{"asks": [["101.2", "3.0"]]}
输出:
"","","101.2","3.0"
- 缺失asks场景:
输入:
{"bids": [["100.5", "2.0"]]}
输出:
"100.5","2.0","",""
原需求(拆分所有bid/ask到单行)的冗余行解决
如果后续还要回到最初拆分所有记录的需求,避免多余行的关键是跳过空字段:
(.bids[]? | [., "bid"]) + (.asks[]? | [., "ask"]) | flatten | @csv
[]?:遇到空数组或不存在的字段直接跳过,不会生成空行- 额外加
"bid"/"ask"标记区分报价类型,最后展开转CSV
内容的提问来源于stack exchange,提问作者SteamedUp
相关产品推荐
相关产品推荐

