如何修复丢失的 json 块分隔符
How to fix missing json block separator
我正在尝试将 7z 文件内容列表转换为 json,但无法修复输出转换块之间缺少的分隔符。
我在 json 转换方面有点新手,但发现 jq 可以完成这项工作。
我在其他地方也阅读了 jq documentation and found examples inside here and 没有解决方案。
请查找用例:
命令行:
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
预期结果应该是:
{
"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"
}
块之间没有逗号分隔符。
谢谢 ;-)
您对 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
调用
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?
我正在尝试将 7z 文件内容列表转换为 json,但无法修复输出转换块之间缺少的分隔符。
我在 json 转换方面有点新手,但发现 jq 可以完成这项工作。
我在其他地方也阅读了 jq documentation and found examples inside here and
请查找用例:
命令行:
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
预期结果应该是:
{ "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" }
块之间没有逗号分隔符。
谢谢 ;-)
您对 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
调用
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?