Я хочу преобразовать данные текстового файла в JSON, используя Jq - PullRequest
0 голосов
/ 11 октября 2018

У меня есть дата в файле, которая выглядит как

test,test
test1,test1

Я хочу преобразовать ее в:

{"test":"test","test1":"test1"}

Я пробовал jq для этой цели jq -R -s -c 'split("\n")'

Но его вывод в формате ["test,test","test1,test1",""]

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Как указывает @peak, используйте inputs с функцией split.Но чтобы объединить ключ / значения в один объект, используйте метод reduce:

jq -Rn '[inputs|split(",")| {(.[0]): .[1]}] | reduce .[] as $obj ({}; . + $obj) ' input.csv

Метод reduce сводит каждый элемент в массиве в один элемент.В этом случае мы указываем, что каждый элемент должен быть присвоен переменной $obj, и что мы начинаем с пустого объекта {}.Второй аргумент метода reduce указывает, как «свести» вещи к одному элементу.В этом случае мы добавляем / объединяем $obj, который мы присвоили объекту {}, с которого мы начали, и затем возвращаем полученный объект, который будет использоваться в следующей итерации.После завершения всех итераций возвращается последний элемент (в данном случае объединенный объект).

0 голосов
/ 16 марта 2019

То, что вы просите, можно достичь с помощью только стандартных утилит оболочки Unix (при условии, что вы ввели file.txt):

bash $ echo { \"$(<file.txt sed 's/,/":"/g' | paste -s -d, - | sed 's/,/","/g')\" } 
{ "test":"test","test1":"test1" }
bash $ 
  • В результате вы получите правильный json
0 голосов
/ 11 октября 2018

jq 1.5 имеет inputs, что обеспечивает простое и эффективное решение:

 jq -R -n -c '[inputs|split(",")|{(.[0]):.[1]}] | add' input.txt

Важно: не забывайте опцию -n, иначе вы потеряете первую строку.

Альтернатива

Если у вашего jq нет inputs, то пора обновить, если это вообще возможно.В противном случае:

jq -R -s '
  split("\n")
  | map(if index(",") then split(",")|{(.[0]):.[1]}
        else empty end)
  | add' input.txt
...