Строка, заключенная в кавычки при вводе CSV, становится дважды экранированной

#json #csv #jq

#json #csv #jq

Вопрос:

Я пытаюсь использовать JQ для обработки CSV, подобного этому, в котором нет заголовков столбцов:

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

Есть ли более элегантный и читаемый способ удалить экранированные кавычки для первого и второго полей — и в целом, для построения потока объектов с учетом такого ввода?


В идеале я хотел бы иметь повторно используемый скрипт, который создает JSON из artbitrary CSV, учитывая файл и список полей в нем, передаваемых в качестве аргумента командной строки.

Текущий сценарий 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:

Ваш вызов 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 параметр командной строки.