代码之家  ›  专栏  ›  技术社区  ›  wass rubleff orgoj

CSV输入中带引号的字符串变为双转义字符串

jq
  •  0
  • wass rubleff orgoj  · 技术社区  · 7 年前

    cat "input.csv"
    "12345678901234567890","2019-03-19",12
    

    是否有更优雅、更可读的方法来删除第一个和第二个字段的转义引号——以及总体而言,在给定此类输入的情况下构建对象流?


    理想情况下,我希望有一个可重用的脚本,它从artbitrary CSV构建JSON,给定一个文件和其中的字段列表作为命令行参数传递。

    当前JQ脚本和输出:

    cat "input.csv" |
    jq \
      --raw-input '
        . |
        split("\n") |
        map( split(",")) |
        .[0] |
        {
          ID: (.[0] | fromjson),
          date: (.[1] | fromjson),
          count: (.[2] | tonumber)
        }'
    
    {
      "ID": "12345678901234567890",
      "date": "2019-03-19",
      "count": 1
    }
    

    相同脚本的输出,不带 | fromjson 使用会导致引用引号,我希望避免:

    {
      "ID": "\"12345678901234567890\"",
      "date": "\"2019-03-19\"",
      "count": 1
    }
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   peak    7 年前

    您对jq的调用可以简化为:

    jq -R '
      split(",")
      | map(fromjson)
      | {ID: .[0], date: .[1], count: .[2] }'
    

    jq -R --argjson header '["ID", "date", "count"]' '
      split(",")
      | map(fromjson)
      | [ $header, . ]
      | transpose
      | reduce .[] as $kv ({}; .[$kv[0]] =$kv[1]) '
    

    如果要指定文件中的标题,请使用 --argfile 而不是命令行选项。