【问题标题】:How to fix missing json block separator如何修复缺少的 json 块分隔符
【发布时间】:2019-02-07 11:35:43
【问题描述】:

我正在尝试将 7z 文件内容列表转换为 json,但无法修复输出转换块之间缺少的分隔符。

我在 json 转换方面有点新手,但发现 jq 可以完成这项工作。 我阅读了jq documentation 并在其他地方找到了示例inside herethere 也没有解决方案。

请查找用例:

命令行:

 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

过滤文件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

预期的结果应该是:

{ “日期”:“2018-06-23”, “时间”:“14:02:16”, “属性”:“。”, “大小”:“4646”, "路径": "安装程序\", “名称”:“许可证”, “extn”:“txt” }, { “日期”:“2018-06-23”, “时间”:“14:02:16”, “属性”:“。”, “尺寸”:“138892”, "路径": "安装程序\", “名称”:“设置”, “extn”:“exe” }

而我只得到:

{ “日期”:“2018-06-23”, “时间”:“14:02:16”, “属性”:“。”, “大小”:“4646”, "路径": "安装程序\", “名称”:“许可证”, “extn”:“txt” } { “日期”:“2018-06-23”, “时间”:“14:02:16”, “属性”:“。”, “尺寸”:“138892”, "路径": "安装程序\", “名称”:“设置”, “extn”:“exe” }

块之间没有逗号分隔符。

谢谢 ;-)

【问题讨论】:

  • 哎呀!命令行未完全记录: jq -f pf_7z.jq -R
  • 您不想生成有效的 JSON 吗?生成有效的 JSON 数组、有效的 CSV 行、YAML 或 TOML ...
  • 是的,这就是我希望使用有效的 JSON 结果以便稍后与 JSONedit 一起使用的结果。并使用 JSONEdit 报告我以下错误:无法解析文本。 *第 10 行,第 1 行右括号后的意外文本请参阅第 10 行,第 1 列了解详细信息

标签: json parsing text jq converters


【解决方案1】:

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 的评论来看,在我看来,您的整体方法可能不是最理想的。您是否考虑过在 JSONEdit 中使用 jq 而不是 jq?

【讨论】:

  • 我不是 json 专家,几天前我才发现 jq,几个月以来我一直在使用 JSONedit,因为我必须检查多个数据转换为 json。我通过这个例子看到了 jq 的力量,我将加强对它的培训以扩展我对它的使用。非常感谢彼得的教学方法;-)
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多