首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jq将任意简单的JSON转换为CSV?

如何使用jq将任意简单的JSON转换为CSV?
EN

Stack Overflow用户
提问于 2015-10-06 02:37:52
回答 6查看 157.3K关注 0票数 183

使用jq,如何将编码浅层对象数组的任意JSON转换为CSV?

在这个站点上有大量的Q&As覆盖特定的数据模型,这些数据模型会对字段进行硬编码,但是对于这个问题的回答应该适用于任何JSON,唯一的限制是它是一个具有标量属性的对象数组(没有深/复杂/子对象,因为平坦这些是另一个问题)。结果应该包含一个标题行,给出字段名。将优先考虑保留第一个对象的字段顺序的答案,但这不是一个要求。结果可以用双引号将所有单元格括起来,或者只包含需要引用的单元格(例如'a,b')。

示例

  1. 输入: {“代码”:“新南威尔士州”、“级别”:“国家”、“国家”、“非盟”}、{“代码”:"AB“、”名称“:”艾伯塔“、”等级“:”省“、”国家“:"CA"}、{”代码“:"ABD”、“ABD”、“ABD”、"Aberdeenshire“、"level":"council area”、“country”、"GB"}。{“代码”:"AK",“名称”:“阿拉斯加”,“等级”:“国家”,“国家”:“美国”} 可能的产出: 代码,名称,级别,国家新南威尔士州,新南威尔士州,非盟AB,艾伯塔,省,CA ABD,阿伯丁郡,议会地区,国标AK,阿拉斯加,州,美国 可能的产出: “代号”、“名称”、“等级”、“新南威尔士州”、“州”、“非盟”、"AB“、”艾伯塔“、”省“、"CA”、"ABD“、”阿伯丁郡“、”理事会区“、”国标“、”阿拉斯加“、”州“、”美国“
  2. 输入: {“名称”:“邦”、“值”:"!“、”级别“:0}、{”名称“:”字母“、”值“:"a、b、c”、“级别”:0}、{“名称”:“字母”、“值”:"x、y、z“、”级别“:1}、{"name":"bang”、"value":“\”!\“、”“级别”:“1”} 可能的产出: 名称,值,水平邦,!,0字母,"a,b,c",0字母,"x,y,z",1 bang,“”!“,”0“ 可能的产出: "name“、"value”、"level“、"bang”、"!“、"0”“字母”、"a、b、c“、"0”“字母”、"x、y、z“、"1”、"bang“、”!“、"1”、“1”
EN

回答 6

Stack Overflow用户

发布于 2015-10-06 08:31:58

首先,获取一个数组,该数组包含对象数组输入中的所有不同对象属性名称。这些将是您的CSV的列:

代码语言:javascript
复制
(map(keys) | add | unique) as $cols

然后,对于对象数组输入中的每个对象,将获得的列名映射到对象中的相应属性。这些将是你的CSV的行。

代码语言:javascript
复制
map(. as $row | $cols | map($row[.])) as $rows

最后,将列名放在行之前,作为CSV的标题,并将得到的行流传递给@csv过滤器。

代码语言:javascript
复制
$cols, $rows[] | @csv

现在都在一起了。记住使用-r标志作为原始字符串获得结果:

代码语言:javascript
复制
jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'
票数 252
EN

Stack Overflow用户

发布于 2017-05-16 22:02:27

下面的筛选器略有不同,因为它将确保将每个值转换为字符串。(jq 1.5+)

代码语言:javascript
复制
# For an array of many objects
jq -f filter.jq [file]

# For many objects (not within array)
jq -s -f filter.jq [file]

filter.jq 滤波器:

代码语言:javascript
复制
def tocsv:
    (map(keys)
        |add
        |unique
        |sort
    ) as $cols
    |map(. as $row
        |$cols
        |map($row[.]|tostring)
    ) as $rows
    |$cols,$rows[]
    | @csv;

tocsv
票数 13
EN

Stack Overflow用户

发布于 2022-09-12 05:11:53

代码语言:javascript
复制
$cat test.json
[
    {"code": "NSW", "name": "New South Wales", "level":"state", "country": "AU"},
    {"code": "AB", "name": "Alberta", "level":"province", "country": "CA"},
    {"code": "ABD", "name": "Aberdeenshire", "level":"council area", "country": "GB"},
    {"code": "AK", "name": "Alaska", "level":"state", "country": "US"}
]


$ jq -r '["Code", "Name", "Level", "Country"], (.[] | [.code, .name, .level, .country]) | @tsv ' test.json
Code    Name    Level   Country
NSW New South Wales state   AU
AB  Alberta province    CA
ABD Aberdeenshire   council area    GB
AK  Alaska  state   US


$ jq -r '["Code", "Name", "Level", "Country"], (.[] | [.code, .name, .level, .country]) | @csv ' test.json
"Code","Name","Level","Country"
"NSW","New South Wales","state","AU"
"AB","Alberta","province","CA"
"ABD","Aberdeenshire","council area","GB"
"AK","Alaska","state","US"
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32960857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档