使用csvkit寻找一个衬板。
来自一个普通的json对象
{
"whatever": 2342,
"otherwise": 119,
"and": 1,
"so": 2,
"on": 3
}
想要这个csv
whatever,2342
otherwise,119
and,1
so,2
on,3
我基本上希望此命令能够正常工作,但事实并非如此。
echo $the_json | in2csv -f json
> When converting a JSON document with a top-level dictionary element, a key must be specified.
似乎csvkit可以做到,而我只是没有找到正确的选项。
答案 0 :(得分:2)
变体A:in2csv
(csvkit)+ csvtool
-I
变体B:改用echo "[$the_json]" | in2csv -I -f json | csvtool transpose -
这是仅使用jq
:(https://stedolan.github.io/jq/)
jq
取自How to map an object to arrays so it can be converted to csv?
echo "$the_json" | jq -r 'to_entries[] | [.key, .value] | @csv'
期望 JSON对象列表,因此您需要将单个对象(in2csv -f json
)包装在方括号({...}
)中。
在POSIX兼容的外壳上,写
[{...}]
将打印
echo "[$the_json]"
您可以将上述数据直接传输到[{
"whatever": 2342,
"otherwise": 119,
"and": 1,
"so": 2,
"on": 3
}]
中。但是,您可能会遇到csvkit的“ 类型推断”(CSV数据解释)功能的问题:
$ echo "[$the_json]" | in2csv -f json whatever,otherwise,and,so,on 2342,119,True,2,3
in2csv
已成为1
。有关详细信息,请参见文档的Tips and Troubleshooting部分。建议使用True
选项关闭类型推断:
$ echo "[$the_json]" | in2csv -I -f json whatever,otherwise,and,so,on 2342,119,1,2,3
现在结果符合预期
仍然,您需要transpose数据。 csvkit文档say:
要转置CSV,请考虑使用csvtool。
({-I
在github,opam,debian以及其他发行渠道上都可用。)
使用csvkit + csvtool,您的最终命令如下所示:
csvtool
,带连字符(echo "[$the_json]" | in2csv -I -f json | csvtool transpose -
)表示从-
中获取数据。结果是:
stdin
我认为仅whatever,2342
otherwise,119
and,1
so,2
on,3
并没有单线解决方案,您将需要csvtool
。但是,您可以改用in2csv
,请参见简短答案。
FTR,我使用的是csvkit版本 1.0.3 。