我正在解析几个日志行并将每个日志行转换为JSON.之后,我将此JSON附加到文件中
my %logContent = (
sequence_number => 0001,
line => "2015-11-27T14:32+05:00 abc.com ssh[2321] fjdklsfjlsdlfksd",
line_number => 689,
);
open (FILE, ">>", "somefile") or die "Cannot open file for append!";
print FILE encode_json \%logContent;
Run Code Online (Sandbox Code Playgroud)
所以现在我有一个包含几行JSON的文件,如:
{sequence_number: 0001, line: gibberish, ...}
{sequence_number: 0003, line: gibberish, ...}
{sequence_number: 0002, line: gibberish, ...}
Run Code Online (Sandbox Code Playgroud)
我想知道根据"sequence_number"的值对JSON行进行排序的最简单方法.换句话说,我希望最终的输出是这样的:
{sequence_number: 0001, line: gibberish, ...}
{sequence_number: 0002, line: gibberish, ...}
{sequence_number: 0003, line: gibberish, ...}
Run Code Online (Sandbox Code Playgroud)
我还有另一个问题:你们/ gals是否认为在正确的行中将新的JSON行插入(不附加)到文件中会更容易,使得最终文件默认排序?我该怎么办?
提前致谢.
您的文件不是JSON文档.您的文件包含一系列JSON文档.要解析它,我们可以使用增量解析器,JSON::XS如下所示:
use JSON::XS qw( );
my $file; { local $/; $file = <>; }
my $json = JSON::XS->utf8->new();
my @objs = $json->incr_parse($file);
@objs = sort { $a->{sequence_number} <=> $b->{sequence_number} } @objs;
for my $obj (@objs) {
print($json->encode($obj), "\n");
}
Run Code Online (Sandbox Code Playgroud)
如果您假设文件的每一行都是一个单独且完整的JSON文档(根据您创建它们的方式无法保证),您可以使用以下内容.但它并没有真正为你节省任何东西:
use JSON::XS qw( );
my $json = JSON::XS->utf8->new();
my @objs;
while (<>) {
push @objs, $json->decode($_);
}
@objs = sort { $a->{sequence_number} <=> $b->{sequence_number} } @objs;
for my $obj (@objs) {
print($json->encode($obj), "\n");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |