如何使用jq将JSON转换为CSV文件?

11
这是我的Json文件:
{
  "ClientCountry": "ca",
  "ClientASN": 812,
  "CacheResponseStatus": 404,
  "CacheResponseBytes": 130756,
  "CacheCacheStatus": "hit"
}
{
  "ClientCountry": "ua",
  "ClientASN": 206996,
  "CacheResponseStatus": 301,
  "CacheResponseBytes": 142,
  "CacheCacheStatus": "unknown"
}
{
  "ClientCountry": "ua",
  "ClientASN": 206996,
  "CacheResponseStatus": 0,
  "CacheResponseBytes": 0,
  "CacheCacheStatus": "unknown"
}

我想将这些json转换成以下的csv格式。

"ClientCountry", "ClientASN","CacheResponseStatus", "CacheResponseBytes", "CacheCacheStatus"
"ca", 812, 404, 130756, "hit";
"ua", 206996, 301, 142,"unknown";
"ua", 206996, 0,0,"unknown";
请告诉我如何使用jq实现这一点?
我刚刚尝试了以下操作。但它不起作用。
jq 'to_entries[] | [.key, .value] | @csv'

致敬, Palani

2个回答

13

假设输入文件中键以一致的顺序呈现,既然您想要所有的键值,那么可以简单地编写:

jq -r '[.[]] | @csv' palanikumar.json

使用给定的输入,这将生成以下CSV:

"ca",812,404,130756,"hit"
"ua",206996,301,142,"unknown"
"ua",206996,0,0,"unknown"

如果您需要的话,可以添加标题和尾随分号(如果真的需要)。这是一项(非常简单)的练习。

键的顺序不一致

如果键的顺序变化或可能变化,则可以使用以下方法生成适当的CSV,假设应使用输入流中第一个对象中的键顺序:

input
| . as $first
| keys_unsorted as $keys
| $keys, [$first[]], (inputs | [.[$keys[]]]) | @csv

适当的 jq 调用应该包括 -n 和 -r 命令行选项。


1
兄弟,我尝试了很多次获取标题。但是无法获得以csv格式提取标题的命令。我尝试了这个jq -r 'keys[]' sample.json。请帮忙。 - Palanikumar

0

@Palanikumar 你试过加上 -r 参数了吗?( jq -r ) - Héctor M.
1
好的,请检查@peak的答案,然后重试。 - Héctor M.
从我看到的情况来看,这是问题 [.key, .value]。 - Héctor M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接