【发布时间】:2019-12-10 09:01:00
【问题描述】:
我正在尝试 join() 一个相对较大的对象数组(20k 个元素),其中包含一个字符(在这种特殊情况下为“\n”)。我预先进行了一些操作,大约在 8 秒内解决(可以接受),但是当我尝试 '| join("\n")' 最后运行时跳转到 3+ 分钟。
有什么理由让 join() 这么慢吗?是否有另一种方法可以在没有 join() 的情况下获得相同的输出?
我目前正在使用 jq-1.5(最新稳定版)
这是 JQ 文件
json2csv.jq
def json2csv:
def tonull: if . == "null" then null else . end;
(.[0] | keys) as $headers |
[(
$headers | join("\t")
), (
[ .[] as $row | [ $headers[] as $h | $row[$h] | tostring | tonull ] | join("\t") ] | join("\n")
)] | join("\n")
;
json2csv
考虑:
$ jq 'length' test.json
23717
有了脚本是我想要的(并放在上面)
$ time jq -rf json2csv.jq test.json > test.csv
real 3m46.721s
user 1m48.660s
sys 1m57.698s
用同样的脚本,去掉join("\n")
$ time jq -rf json2csv.jq test.json > test.csv
real 0m8.564s
user 0m8.301s
sys 0m0.242s
(注意:我删除了第二个连接,因为否则 JQ 无法聚合一个数组和一个字符串,这是有道理的(但这只是在一个包含 2 个元素的数组上,所以第二个连接不是问题))
【问题讨论】:
标签: json jq processing-efficiency