2015-11-26 2 views
0

Я разбираю несколько строк журнала и преобразую их в 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; 

Так что теперь у меня есть файл, который содержит несколько строк JSON, как например:

{sequence_number: 0001, line: gibberish, ...} 
{sequence_number: 0003, line: gibberish, ...} 
{sequence_number: 0002, line: gibberish, ...} 

Я хотел бы знать, самый простой способ для меня сортируйте строки JSON на основе значения «sequence_number». Другими словами, я хотел бы конечный результат будет что-то вроде:

{sequence_number: 0001, line: gibberish, ...} 
{sequence_number: 0002, line: gibberish, ...} 
{sequence_number: 0003, line: gibberish, ...} 

У меня есть еще один вопрос: Есть ли у вас, ребята/девочки думают, что было бы проще вставить (не добавлять) новую линию JSON в файл в правильной строке, делая окончательный файл отсортированным по умолчанию? Как мне это сделать?

Заранее спасибо.

+5

Это ужасно. Один файл не должен содержать несколько структур данных JSON без простого способа их разграничения. Кто это сделал? Вы застряли с ним, или можете предложить изменить? – Borodin

+0

В моем примере я не ввел новый символ строки, поскольку я думал, что JSON в отдельных строках подразумевает это. Я могу изменить его, но я не понимаю, зачем мне это нужно. Может быть, вы можете дать мне минусы, прежде чем я его изменю. – Mark

ответ

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"); 
} 
+0

Ничего себе, спасибо. Ок, я думаю, я ленился за то, что не писал двойные кавычки и все в моем примере. Да, каждая строка действительна JSON, и я включил JSON :: XS в свой скрипт, который не смог записать его в моем примере. Не могли бы вы вставить новую строку в файл и ожидать, что результат будет отсортирован как непростая задача? – Mark

+0

@Borodin, Они не в последовательности, поэтому вопрос, и поэтому почему я использовал «серию» (* ряд вещей, событий или людей подобного рода или родственной природы, следующих один за другим *) вместо « последовательность". Я также сознательно выбрал приказ и, таким образом, акцентировал свои первые два заявления. – ikegami

+0

@Mark, я не знаю, почему вы упоминаете цитаты и загружаете JSON :: XS. Нет, каждая строка не может быть действительной JSON. ('encode_json' не гарантирует вывод без новых строк.) Что касается вашего вопроса, я не уверен, что вы спрашиваете. – ikegami

Смежные вопросы