Как исправить недостающий разделитель json - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь преобразовать список содержимого файла 7z в json и не могу исправить отсутствующий разделитель между преобразованными выходными блоками.

Я немного новичок в преобразовании json, но обнаружил, что jq может сделатьработа.Я прочитал документацию jq и нашел примеры внутри здесь и там также в другом месте без решения.

Пожалуйста, найдите вариант использования:

Командная строка:

jq -f pf_7z.jq -R 

<h2>The input file demo.lst:</h2>

<pre><code>   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2018-06-23 14:02:16 D....            0            0  Installer
2018-06-23 14:02:16 .....         3381         1157  Installer\Readme
2018-06-23 14:02:16 .....         4646         1157  Installer\License.txt
2018-06-23 14:02:16 .....       138892       136152  Installer\Setup.exe
</code>

Файл фильтра pf7z.jq:

def parse: def parse_line: . | map(match("(\\d+-\\d+-\\d+) (\\d+:\\d+:\\d+) (D|.).* +(\\d+) +(\\d+) +(.*\\\\)([^\\\\]*)\\.(.*)")) | .[] | ({ "date" :(.captures[0].string), "time" :(.captures[1].string), "attr" :(.captures[2].string), "size" :(.captures[3].string), "path" :(.captures[5].string), "name" :(.captures[6].string), "extn" :(.captures[7].string) }); split("\n") | ( {} + (parse_line)); parse

Ожидаемый результат должен быть:

{"date":" 2018-06-23 "," time ":" 14:02:16 "," attr ":". "," Size ":" 4646 "," path ":" Installer \ "," name ": "License", "extn": "txt"}, {"date": "2018-06-23", "time": "14:02:16", "attr": ".", "Size": "138892", "path": "Installer \", "name": "Setup", "extn": "exe"}

И я получил только:

{"date":" 2018-06-23 "," time ":" 14:02:16 "," attr ":". "," Size ":" 4646 "," path ":" Installer \ "," name ": "License", "extn": "txt"} {"date": "2018-06-23", "time": "14:02:16", "attr": ".", "Size":"138892", "path": "Installer \", "name": "Setup", "extn": "exe"}

без разделителя запятых между блоками.

Спасибо;-)

1 Ответ

0 голосов
/ 07 февраля 2019

Ваше определение для parse_line создает поток сущностей JSON, тогда как вы, очевидно, хотите массив JSON.Используя ваше регулярное выражение, вы можете написать:

def parse:
  def parse_line:
    match("(\\d+-\\d+-\\d+) (\\d+:\\d+:\\d+) (D|.).* +(\\d+) +(\\d+) +(.*\\\\)([^\\\\]*)\\.(.*)")
    | .captures
    | map(.string)
    | { "date" :.[0],
        "time" :.[1],
        "attr" :.[2],
        "size" :.[3],
        "path" :.[5],
        "name" :.[6],
        "extn" :.[7] } ;

  [inputs | parse_line];

parse

Invocation

jq -nR -f 7z.jq 7z.txt

Альтернативное регулярное выражение

Фрагмент регулярного выражения (D|.).* не имеет особого смысла.Вам следует подумать о его замене на (.)[^ ]* или что-то подобное.

Более простое решение

def parse_line:
  capture("(?<date>\\d+-\\d+-\\d+) " 
  + "(?<time>\\d+:\\d+:\\d+) " 
  + "(?<attr>.)[^ ]* +" 
  + "(?<size>\\d+) +\\d+ +"
  + "(?<path>.*\\\\)"
  + "(?<name>[^\\\\]*)\\."
  + "(?<extn>.*)");

[inputs | parse_line]

Альтернативный подход

Из комментария о JSONEdit кажется вероятныммне, что ваш общий подход может быть неоптимальным.Вы рассматривали возможность использования jq вместо jq с JSONEdit?

...