如何用jq流式转换超大无分隔符类JSON文件为有效JSON数组?
如何用jq流式处理超大无分隔符JSON记录文件,转换为JSON数组(避免全量加载内存)
问题背景
- 客户生成数十GB级的超大类JSON文件,无法控制文件大小与内容
- 文件为无分隔符的连续JSON记录(非标准有效JSON),格式示例:
{ "a":1, "b": 2 } { "a":2, "b": 4 } { "a":3, "b": 6 } - 软件部署在客户现场,无人值守维护
- 客户拥有大量此类文件,且客户数量众多,定制编码是最后选择
- 环境已预装jq工具,优先使用现有工具
需求
将上述格式转换为标准JSON数组:
[ { "a":1, "b": 2 }, { "a":2, "b": 4 }, { "a":3, "b": 6 } ]
要求采用流式处理,避免jq -s(--slurp)将整个多GB文件加载到内存的问题,降低资源消耗。
解决方案:jq流式处理命令
方法1:简洁版命令
通过组合shell命令和jq逐行处理,手动拼接JSON数组的首尾:
echo '[' && \ jq -n 'inputs | (input_line_number > 1) as $is_not_first | if $is_not_first then ",\(.)" else . end' large_file.json && \ echo ']'
方法2:纯jq优雅版
用jq内置的foreach维护状态,自动处理逗号分隔,输出格式更规整:
jq -n ' print("["); foreach inputs as $item ( {is_first: true}; if .is_first then (.is_first = false) | $item else ",\n" + $item end; print(.) ); print("\n]") ' large_file.json
原理说明
-n选项:阻止jq自动读取全部输入,改用inputs逐个读取每条JSON记录,实现流式处理foreach语句:维护一个状态变量is_first,标记当前是否是第一条记录- 第一条记录直接输出,后续记录前添加逗号和换行,保证JSON数组格式合法且美观
- 手动输出数组的起始
[和结束],最终拼接成完整的标准JSON数组 - 全程仅加载单条JSON记录到内存,内存消耗稳定,适配数十GB级超大文件
内容的提问来源于stack exchange,提问作者Tony Ennis
相关产品推荐
相关产品推荐

