在文件中对JSON行进行排序

Mar*_*ark 0 sorting perl json

我正在解析几个日志行并将每个日志行转换为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行插入(不附加)到文件中会更容易,使得最终文件默认排序?我该怎么办?

提前致谢.

ike*_*ami 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");
}
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)