如何对大型JSON/NDJSON文件执行基于数学运算的批量字段修改?
超大JSON/NDJSON字段批量修改方案
处理超大文件的核心原则:绝对不要将整个文件加载到内存,针对你实际使用的NDJSON(每行一个独立JSON对象)格式,逐行读取处理即可,不管文件多大内存占用都能保持在极低水平。
方案1:使用jq命令行工具(推荐,效率最高)
jq原生支持流式处理NDJSON,无需写复杂代码,一行命令即可完成需求。
你的文件中交替存在{"index": {...}}元数据行和真实业务数据行,命令可以加判断仅修改带price字段的行,其他行原样保留:
jq -c 'if has("price") then .price = (.price / 10) else . end' 输入文件名.ndjson > 输出文件名.ndjson
参数说明:
-c表示压缩输出,保持每行一个JSON的NDJSON格式,不会破坏原文件结构- 逻辑非常简单:判断当前行JSON是否存在price字段,存在则将price除以10,否则直接输出原内容
该方案处理GB级别的NDJSON文件也不会占用过高内存,执行速度远快于自己写脚本。
方案2:Python逐行处理(适合需要自定义复杂逻辑的场景)
如果后续还有其他自定义处理需求,可以用Python写轻量脚本实现,全程逐行读写:
import json # 替换为你自己的输入、输出文件路径 input_path = "你的原始文件.ndjson" output_path = "修改后的文件.ndjson" with open(input_path, "r", encoding="utf-8") as f_in, open(output_path, "w", encoding="utf-8") as f_out: for line in f_in: line = line.strip() if not line: continue data = json.loads(line) # 仅处理带price字段的业务数据行 if "price" in data: # 如果需要整除取整可以把/换成// data["price"] = data["price"] / 10 f_out.write(json.dumps(data, ensure_ascii=False) + "\n")
通用场景扩展(对应你最初的salary除以k需求)
如果是处理普通大体积JSON数组而非NDJSON,可以用流式JSON解析工具处理,比如Python的ijson库,同样是逐块解析不会加载整个文件。如果是其他字段的数值修改,把上述方案中对应的字段名、除数替换成你需要的内容即可。
内容的提问来源于stack exchange,提问作者Joebevo
相关产品推荐
相关产品推荐

