CSV输入中带引号的字符串被两次转义

时间:2019-03-19 18:19:31

标签: json csv jq

我正在尝试使用JQ这样处理CSV,但没有列标题:

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

是否有一种更优雅,更易读的方法来删除第一字段和第二字段的转义引号-以及总体上,在有这种输入的情况下构建对象流?


理想情况下,我希望有一个可重用的脚本,该脚本从任意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
}

1 个答案:

答案 0 :(得分:1)

您对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命令行选项。