我有几个大型CSV文件,我想将其导出为特定的JSON格式,但我不确定如何将其转换。这是用户名和网址的列表。
b00nw33,harrypotter788.flv
b00nw33,harrypotter788.mov
b00nw33,levitation271.avi
b01spider,schimbvalutar109.avi
...
我想将它们导出到按用户名分组的JSON,如下所示:
{
"b00nw33": [
"harrypotter788.flv",
"harrypotter788.mov",
"levitation271.avi"
],
"b01spider": [
"schimbvalutar109.avi"
]
}
执行此操作的JQ是什么?谢谢!
答案 0 :(得分:2)
简单解决方案的关键是通用函数aggregate_by
:
# In this formulation, f must either always evaluate to a string or
# always to an integer, it being understood that negative integers
# might be problematic
def aggregate_by(s; f; g):
reduce s as $x (null; .[$x|f] += [$x|g]);
如果只需将逗号分隔即可准确解析CSV,则可以使用以下jq过滤器完成所需的转换:
aggregate_by(inputs | split(","); .[0]; .[1])
这假定jq是使用-R(原始)和-n选项调用的。
使用给定的CSV输入,输出将是:
{
"b00nw33": [
"harrypotter788.flv",
"harrypotter788.mov",
"levitation271.avi"
],
"b01spider": [
"schimbvalutar109.avi"
]
}
以上解决方案假定CSV与示例一样简单。相反,如果仅通过逗号分隔不能准确地解析CSV,则将需要更通用的解析器。
一种方法是在https://github.com/fadado/CSV使用非常强大且快速的csv2json解析器
或者,您可以使用许多可用的“ csv2tsv”解析器之一来生成TSV,jq可以直接处理该TSV(通过拆分制表符,即split("\t")
而不是split(",")
)。
在任何情况下,一旦CSV转换为JSON,就可以使用上面定义的过滤器aggregate_by
。
如果您对CSV的jq解析器感兴趣,则可能需要查看fromcsvfile
(https://gist.github.com/pkoppstein/bbbbdf7489c8c515680beb1c75fa59f2);也可以看看
https://github.com/stedolan/jq/issues/1650#issuecomment-448050902
fromcsv
的定义