如何将对象映射到数组以便可以将其转换为 csv?
Posted
技术标签:
【中文标题】如何将对象映射到数组以便可以将其转换为 csv?【英文标题】:How to map an object to arrays so it can be converted to csv? 【发布时间】:2013-12-09 11:51:30 【问题描述】:我正在尝试转换如下所示的对象:
"123" : "abc",
"231" : "dbh",
"452" : "xyz"
到如下所示的 csv:
"123","abc"
"231","dbh"
"452","xyz"
我更喜欢使用命令行工具jq,但似乎无法弄清楚如何进行分配。我设法通过jq '. | keys' test.json
获得了密钥,但不知道下一步该做什么。
问题是您无法使用@csv
将这样的 k:v 对象直接转换为 csv。它需要是一个数组,所以我们需要先转换为一个数组。如果键被命名,它会很简单,但它们是动态的,所以它不是那么容易。
【问题讨论】:
为什么不只是 gsub ':' for ',' ? googleJSON to csv
...很多结果
【参考方案1】:
试试这个 给出你想要的相同输出
echo '"123":"abc","231":"dbh","452":"xyz"' | jq -r 'to_entries | .[] | "\"" + .key + "\",\"" + (.value | tostring)+ "\""'
【讨论】:
【参考方案2】:这是我今天早上最终使用的一个示例(处理 PagerDuty 警报):
cat /tmp/summary.json | jq -r '
.incidents
| map(desc: .trigger_summary_data.description, id:.id)
| group_by(.desc)
| map(length as $len
| desc:.[0].desc, length: $len)
| sort_by(.length)
| map([.desc, .length] | @csv)
| join("\n") '
这会转储一个 CVS 分隔的文档,如下所示:
"[Triggered] Something annoyingly frequent",31
"[Triggered] Even more frequent alert!",35
"[No data] Stats Server is probably acting up",55
【讨论】:
【参考方案3】:试试这个过滤器:
to_entries[] | [.key, .value]
to_entries
将对象转换为键/值对象数组。 []
将数组分解为数组中的每个项
然后对于每个项目,转换为包含键和值的数组。
这会产生以下输出:
[
"123",
"abc"
],
[
"231",
"dbh"
],
[
"452",
"xyz"
]
然后您可以使用@csv
过滤器将行转换为 CSV 行。
$ echo '"123":"abc","231":"dbh","452":"xyz"' | jq -r 'to_entries[] | [.key, .value] | @csv'
"123","abc"
"231","dbh"
"452","xyz"
【讨论】:
嗯。对我来说,这会返回“\"123\",\"abc\""
等。即每行都被额外引用。
确保将-r
标志添加到调用中。你会想要得到原始输出。
谢谢,我忽略了这一点。
如何在 JSON 中间使用to_entries
进行哈希处理?我见过的所有示例都假设目标哈希位于根目录。【参考方案4】:
onecol2txt ()
awk 'BEGIN RS="_end_"; FS="\n"
for (i=2; i <= NF; i++)
printf "%s ",$i
printf "\n"
'
cat jsonfile | jq -r -c '....,"_end_"' | onecol2txt
【讨论】:
【参考方案5】:Jeff 的回答是一个很好的起点,更接近您的预期:
cat input.json | jq 'to_entries | map([.key, .value]|join(","))'
[
"123,abc",
"231,dbh",
"452,xyz"
]
但没有找到使用换行符加入的方法:
cat input.json | jq 'to_entries | map([.key, .value]|join(","))|join("\n")'
"123,abc\n231,dbh\n452,xyz"
【讨论】:
"\n" 是换行符的 JSON 表示;要将其视为文字换行符,请使用 jq 的 -r 命令行选项。但是,一般来说,使用@csv
获取 CSV 是更好的方法,因为@csv 确实会生成有效的 CSV。以上是关于如何将对象映射到数组以便可以将其转换为 csv?的主要内容,如果未能解决你的问题,请参考以下文章