You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:48:20