将CSV转换为分组JSON

时间:2018-12-18 01:59:24

标签: json csv grouping jq file-conversion

我有几个大型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是什么?谢谢!

1 个答案:

答案 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与示例一样简单。相反,如果仅通过逗号分隔不能准确地解析CSV,则将需要更通用的解析器。

一种方法是在https://github.com/fadado/CSV使用非常强大且快速的csv2json解析器

或者,您可以使用许多可用的“ csv2tsv”解析器之一来生成TSV,jq可以直接处理该TSV(通过拆分制表符,即split("\t")而不是split(","))。

在任何情况下,一旦CSV转换为JSON,就可以使用上面定义的过滤器aggregate_by

如果您对CSV的jq解析器感兴趣,则可能需要查看fromcsvfilehttps://gist.github.com/pkoppstein/bbbbdf7489c8c515680beb1c75fa59f2);也可以看看 https://github.com/stedolan/jq/issues/1650#issuecomment-448050902

提出了fromcsv的定义