2

Looking for a one liner with csvkit.

From a plain json object

{
  "whatever": 2342,
  "otherwise": 119,
  "and": 1,
  "so": 2,
  "on": 3
}

Want this csv

whatever,2342
otherwise,119
and,1
so,2
on,3

I basically want this command to work, but it doesn't.

echo $the_json | in2csv -f json
> When converting a JSON document with a top-level dictionary element, a key must be specified.

Seems like something csvkit can do, and I just haven't found the right options.

4

2 回答 2

2

简短的回答

变体 A:in2csv(csvkit)+csvtool

  • 将您的 json 包裹在括号中
  • 使用in2csv's-I选项来避免意外行为
  • 使用命令转置两行 CSV,例如csvtool
echo "[$the_json]" | in2csv -I -f json | csvtool transpose -

变体 B:jq改用

这是一个仅使用的解决方案jq:(https://stedolan.github.io/jq/

echo "$the_json" | jq -r 'to_entries[] | [.key, .value] | @csv'

取自如何将对象映射到数组以便可以将其转换为 csv?


长答案(csvkit + csvtool)

输入

in2csv -f json需要一个JSON 对象列表,因此您需要将单个对象 ( {...}) 包装到方括号 ( [{...}]) 中。

在 POSIX 兼容的 shell 上,写

echo "[$the_json]"

这将打印

[{
  "whatever": 2342,
  "otherwise": 119,
  "and": 1,
  "so": 2,
  "on": 3
}]

csvkit 命令

您可以将上述数据直接通过管道传输到in2csv. 但是,您可能会遇到 csvkit 的“<em>类型推断”(CSV 数据解释)功能的问题:

$ echo "[$the_json]" | in2csv -f json
无论如何,否则,并且,所以,在
2342,119,真,2,3

1已成为True。有关详细信息,请参阅文档的提示和故障排除部分。-I建议使用以下选项关闭类型推断:

$ echo "[$the_json]" | in2csv -I -f json
无论如何,否则,并且,所以,在
2342,119,1,2,3

现在结果如预期

转置数据

不过,您需要转置数据。csvkit 文档

要转置 CSV,请考虑csvtool

csvtoolgithubopamdebian和可能的其他分发渠道上可用。)

使用 csvkit + csvtool,您的最终命令如下所示:

echo "[$the_json]" | in2csv -I -f json | csvtool transpose -

连字符 ( -) 表示从中获取数据stdin。这是结果:

whatever,2342
otherwise,119
and,1
so,2
on,3

而已。

我认为没有唯一的解决方案csvtool,您需要in2csv. 但是,您可以jq改用,查看简短答案。

FTR,我正在使用 csvkit 版本1.0.3

于 2019-03-12T09:14:08.863 回答
0

测试了第一个发布的答案作品!但这有点令人困惑,因为“[$the_json]”表示 json 的原始内容。所以命令的一个例子可能是这样的:

echo '[{"a":"b","c":"d"}]' | in2csv -I -f json | csvtool transpose -

如果您想使用文件名来代替,例如 myfile.json 可以使用 sed 命令添加括号并将其通过管道传输到 in2csv:

sed -e '1s/^/[/' -e 's/$/,/' -e '$s/,$/]/' myfile.json | in2csv -I -f json > myfile.csv

完整转置命令的示例:

sed -e '1s/^/[/' -e 's/$/,/' -e '$s/,$/]/' myfile.json | in2csv -I -f json | csvtool transpose - > myfile.csv

来源:如何在 UNIX 上以文本开头和结尾添加括号

于 2021-12-14T16:00:02.917 回答