将 CSV 转换为分组 JSON
Convert CSV to Grouped JSON
我有几个大型 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?谢谢!
简单解决方案的关键是通用函数 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])
这假定使用 -R(原始)和 -n 选项调用 jq。
输出
对于给定的 CSV 输入,输出将是:
{
"b00nw33": [
"harrypotter788.flv",
"harrypotter788.mov",
"levitation271.avi"
],
"b01spider": [
"schimbvalutar109.avi"
]
}
处理重要的 CSV
上述解决方案假定 CSV 与样本一样简单。相反,如果 CSV 无法通过简单地以逗号分隔来准确解析,则需要更通用的解析器。
一种方法是在 https://github.com/fadado/CSV
使用非常强大且快速的 csv2json 解析器
或者,您可以使用众多可用的 "csv2tsv" 解析器之一来生成 TSV,jq 可以直接处理(通过在制表符上拆分,即 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
的定义
我有几个大型 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?谢谢!
简单解决方案的关键是通用函数 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])
这假定使用 -R(原始)和 -n 选项调用 jq。
输出
对于给定的 CSV 输入,输出将是:
{
"b00nw33": [
"harrypotter788.flv",
"harrypotter788.mov",
"levitation271.avi"
],
"b01spider": [
"schimbvalutar109.avi"
]
}
处理重要的 CSV
上述解决方案假定 CSV 与样本一样简单。相反,如果 CSV 无法通过简单地以逗号分隔来准确解析,则需要更通用的解析器。
一种方法是在 https://github.com/fadado/CSV
使用非常强大且快速的 csv2json 解析器或者,您可以使用众多可用的 "csv2tsv" 解析器之一来生成 TSV,jq 可以直接处理(通过在制表符上拆分,即 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
的定义