代码之家  ›  专栏  ›  技术社区  ›  RADXack

将csv转换为分组的json

  •  1
  • RADXack  · 技术社区  · 6 年前

    我有几个大的csv文件,我想导出到特定的json格式,但我不确定如何转换它。它是用户名和URL的列表。

    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 回复  |  直到 6 年前
        1
  •  2
  •   peak    6 年前

    简单解决方案的关键是通用函数 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(raw)和-n选项调用jq。

    产量

    对于给定的csv输入,输出将是:

    {
      "b00nw33": [
        "harrypotter788.flv",
        "harrypotter788.mov",
        "levitation271.avi"
      ],
      "b01spider": [
        "schimbvalutar109.avi"
      ]
    }
    

    处理非平凡的csv

    上述解决方案假设csv与示例一样简单。相反,如果不能通过简单地用逗号拆分来准确地解析csv,则需要更通用的解析器。

    一种方法是在 https://github.com/fadado/CSV

    或者,您可以使用许多可用的“csv2tsv”解析器中的一个来生成tsv,jq可以直接处理它(通过拆分选项卡,即 split("\t") 而不是 split(",") )

    在任何情况下,一旦csv转换为json,过滤器 聚集体 可以使用上面定义的。

    如果您对用于csv的jq解析器感兴趣,您可能需要查看 fromcsvfile ( https://gist.github.com/pkoppstein/bbbbdf7489c8c515680beb1c75fa59f2 参见 的定义 fromcsv 提议时间: https://github.com/stedolan/jq/issues/1650#issuecomment-448050902