Как получить совпадения последовательно с помощью Perl - PullRequest
0 голосов
/ 29 апреля 2019

У меня +1000 json-файлов, таких как:

({
  "Companies": [
    {
      "company": "COMPANY_1",
      "time": "20DAYS"
    },
    {
      "company": "COMPANY_2",
      "time": "1DAY"
    },
  ]
})

, используя perl, как мне получить такой вывод:

COMPANY_1:20DAYS,COMPANY_2:1DAY

я пытаюсь этой командой

perl -lnE '$x = (split /=/,$ARGV)[4], say "$x:", join ",", /(?<="company":")[^"]*/g,/(?<="time":")[^"]*/g' file.txt

но я получаю вывод следующим образом:

COMPANY_1,COMPANY_2,1DAY,20DAYS

Желаемый вывод:

COMPANY_1:20DAYS,COMPANY_2:1DAY

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

Зачем пытаться написать свой собственный анализатор JSON, когда такие вещи уже существуют?

Обратите внимание, что у вас нет JSON & ndash; у вас есть лишние скобки вокруг целого и лишняя запятая в конце списков & mdash; но мы можем компенсировать это.

perl -MJSON::XS -CS -0777ne'
   BEGIN { $j = JSON::XS->new->relaxed(1) }
   s/^\(//;  s/\)\z//;
   CORE::say
      join ",",
         map { join ":", $_->{company}, $_->{time} }
            @{ $j->decode($_)->{Companies} }
' *.json
1 голос
/ 29 апреля 2019

В одну сторону:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use List::Util qw/pairs/;

my $str = q/"company": "COMPANY_1","time": "20DAYS","company": "COMPANY_2","time": "1DAY",/;

my @pairs = $str =~ m/"company" \s* : \s* "([^"]+)" \s* ,
                      "time" \s* : \s* "([^"]+)"/gx;
my @output;
for my $pair (pairs @pairs) {
    push @output, join(':', @$pair);
}
say join(',', @output);

Если ваши исходные данные на самом деле являются JSON, то вы по каким-то причинам отбираете значения {} и [].лучше придерживаться исходных данных и использовать JSON::XS или что-то еще для их анализа вместо использования регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...