csvkit in2csv-如何将单个json对象转换为两列csv

时间:2019-03-08 00:47:33

标签: csvkit

使用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可以做到,而我只是没有找到正确的选项。

1 个答案:

答案 0 :(得分:2)

简短答案

变体A:in2csv(csvkit)+ csvtool

  • 将您的json放在括号中
  • 使用in2csv的{​​{1}}选项来避免意外行为
  • 使用命令transpose两行CSV,例如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?


长答案(csvkit + csvtool)

输入

echo "$the_json" | jq -r 'to_entries[] | [.key, .value] | @csv' 期望 JSON对象列表,因此您需要将单个对象(in2csv -f json)包装在方括号({...})中。

在POSIX兼容的外壳上,写

[{...}]

将打印

echo "[$the_json]"

csvkit命令

您可以将上述数据直接传输到[{ "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

({-Igithubopamdebian以及其他发行渠道上都可用。)

使用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