Конвертировать данные в текстовом файле в формат JSON - PullRequest
0 голосов
/ 12 сентября 2018

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

1. John (1994)  92      
2. Granny (1972)    82  

Я хочу преобразовать эти данные в формат JSON с помощью Awk.Ожидаемый результат:

[{
  "ID" : ​    "1"​,
  "Name" : ​  "John",
  "Birth" : ​ "1994",
  "Marks" : ​ "92"
}]

Я пробовал использовать jq

jq -R '[ split("\n")[] | select(length > 0) | split(" ") | {ID: .[0], Name: .[1], Birth: .[2], Marks: .[3]}]' data.txt

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Если вам интересно, как это сделать с jq, вот один из способов.

parse.jq

split("\n") | 
map(match("(\\d+)\\. +([\\w ]+) +\\((\\d+)\\) +(\\d+)")) | .[] |
{ 
  "ID"    : (.captures[0].string),
  "Name"  : (.captures[1].string),
  "Birth" : (.captures[2].string),
  "Marks" : (.captures[3].string)
}

Запустите его так:

jq -R -f parse.jq infile.txt

Вывод:

{
  "ID": "1",
  "Name": "John",
  "Birth": "1994",
  "Marks": "92"
}
{
  "ID": "2",
  "Name": "Granny",
  "Birth": "1972",
  "Marks": "82"
}
0 голосов
/ 13 сентября 2018

Для записи, следующий jq однострочный дает (что, кажется,) желаемый результат:

jq -R '[capture("(?<ID>[0-9]+)\\. *(?<Name>[^(]*) \\((?<Birth>[^)]*)\\) *(?<Marks>[0-9]*)")]' data.txt

, а именно:

[
  {
    "ID": "1",
    "Name": "John",
    "Birth": "1994",
    "Marks": "92"
  }
]
[
  {
    "ID": "2",
    "Name": "Granny",
    "Birth": "1972",
    "Marks": "82"
  }
]

Если кто-то хочет захватитьобъекты в одном массиве, можно использовать inputs, например:

jq -nR '[inputs|capture("(?<ID>[0-9]+)\\. *(?<Name>[^(]*) \\((?<Birth>[^)]*)\\) *(?<Marks>[0-9]*)")]' data.txt

ОП также спрашивает:

, если имя состоит из разделенной пробелами строки

Приведенное выше регулярное выражение допускает пробелы в имени.

0 голосов
/ 12 сентября 2018
awk ' BEGIN { print "[" ; }  { print " {\n" "   \"ID\" : \""   $1  "\",\n"  "   \"Name\" : \""  $2 "\",\n"  "   \"Birth\" : \""  $3  "\",\n"  "   \"Marks\" : \""  $4  "\"\n" " }" }   END { print "]" } ' data.txt

или вы тоже можете сделать следующее.

awk ' BEGIN { print "[" ; }                     \
      { print  " {"                             \
        print  "   \"ID\" : \""     $1  "\","   \
        print  "   \"Name\" : \""   $2  "\","   \
        print  "   \"Birth\" : \""  $3  "\","   \
        print  "   \"Marks\" : \""  $4  "\""    \
        print  " }"                             \
      }                                         \
      END { print "]" } '  data.txt       

Тогда вы увидите следующий вывод.

[
 {
   "ID" : "1.",
   "Name" : "John",
   "Birth" : "(1994)",
   "Marks" : "92"
 }
 {
   "ID" : "2.",
   "Name" : "Granny",
   "Birth" : "(1972)",
   "Marks" : "82"
 }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...