使用jq,如何将编码浅层对象数组的任意JSON转换为CSV?
在这个站点上有大量的Q&As覆盖特定的数据模型,这些数据模型会对字段进行硬编码,但是对于这个问题的回答应该适用于任何JSON,唯一的限制是它是一个具有标量属性的对象数组(没有深/复杂/子对象,因为平坦这些是另一个问题)。结果应该包含一个标题行,给出字段名。将优先考虑保留第一个对象的字段顺序的答案,但这不是一个要求。结果可以用双引号将所有单元格括起来,或者只包含需要引用的单元格(例如'a,b')。
示例
发布于 2015-10-06 08:31:58
首先,获取一个数组,该数组包含对象数组输入中的所有不同对象属性名称。这些将是您的CSV的列:
(map(keys) | add | unique) as $cols然后,对于对象数组输入中的每个对象,将获得的列名映射到对象中的相应属性。这些将是你的CSV的行。
map(. as $row | $cols | map($row[.])) as $rows最后,将列名放在行之前,作为CSV的标题,并将得到的行流传递给@csv过滤器。
$cols, $rows[] | @csv现在都在一起了。记住使用-r标志作为原始字符串获得结果:
jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'发布于 2017-05-16 22:02:27
下面的筛选器略有不同,因为它将确保将每个值转换为字符串。(jq 1.5+)
# 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 滤波器:
def tocsv:
(map(keys)
|add
|unique
|sort
) as $cols
|map(. as $row
|$cols
|map($row[.]|tostring)
) as $rows
|$cols,$rows[]
| @csv;
tocsv发布于 2022-09-12 05:11:53
$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"https://stackoverflow.com/questions/32960857
复制相似问题