如何修复丢失的JSON块分离器

问题描述 投票:0回答:1

我想转换的7z文件内容列表,以JSON和无法修复丢失的隔板之间输出转换块。

我在JSON的转换有点新手,却发现JQ可以做的工作。我读了jq documentation,发现例子inside herethere在其他地方也无解。

请找用例:

The command line:

    jq -f pf_7z.jq -R 

输入文件demo.lst:

   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

The filter file 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

The expected result should be:

{ “日期”: “2018年6月23日”, “时间”: “14时02分16秒”, “ATTR”:, “大小”, “”: “4646”, “路径”: “安装程序\”, “名”: “许可证”, “分机”: “TXT”},{ “日期”: “2018年6月23日”, “时间”: “14时02分16秒”, “ATTR”: “”, “大小”: “138892”, “路径”: “安装程序\”, “名”: “设置”, “分机”: “EXE”}

And I only got :

{ “日期”: “2018年6月23日”, “时间”: “14时02分16秒”, “ATTR”:, “大小”, “”: “4646”, “路径”: “安装程序\”, “名”: “许可证”, “分机”: “TXT”} { “日期”: “2018年6月23日”, “时间”: “14时02分16秒”, “ATTR”:” “”大小“: ”138892“, ”路径“: ”安装程序\“, ”名“: ”设置“, ”分机“: ”EXE“}

没有块之间的逗号分隔符。

谢谢 ;-)

json parsing text jq converters
1个回答
0
投票

您的parse_line DEF产生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

调用

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?

© www.soinside.com 2019 - 2024. All rights reserved.