我正在解析几个日志行并将每个日志行转换为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;
所以现在我有一个包含几行JSON的文件,如:
{sequence_number: 0001, line: gibberish, ...}
{sequence_number: 0003, line: gibberish, ...}
{sequence_number: 0002, line: gibberish, ...}
我想知道根据“sequence_number”的值对JSON行进行排序的最简单方法。换句话说,我希望最终输出类似于:
{sequence_number: 0001, line: gibberish, ...}
{sequence_number: 0002, line: gibberish, ...}
{sequence_number: 0003, line: gibberish, ...}
我还有另一个问题:你们/ gals是否认为在正确的行中将新的JSON行插入(不附加)到文件中会更容易,使得最终文件默认排序?我该怎么做?
提前致谢。
答案 0 :(得分:5)
您的文件不是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");
}
如果您假设文件的每一行都是一个单独且完整的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");
}