2016-09-14 6 views
1

Я огляделся, но не могу найти подходящего рабочего решения. Я пытаюсь использовать TEXT: CSV_XS, поэтому речь идет не просто о том, чтобы сделать что-то трудное с регулярным выражением. Я не могу легко установить TEXT :: CSV, но у меня есть версия XS.Parse CSV со встроенными кавычками на смешанной строке

Мне просто нужно проанализировать поля csv, которые я потом сломаю в пары kv.

use Text::CSV_XS; 
use Data::Dumper; 

my $csv = Text::CSV_XS->new ({ allow_loose_quotes => 1, 
           allow_whitespace => 1, 
           eol => $/ }); 

my $str3 = '09/11/2016 22:05:00 +0000, search_name="ThreatInjection - Rule", search_now=1473644880.000, search="bunchof|stuff1,bunch%of-stuff2", count=100'; 

my $status = $csv->parse($str3); 
my @details = $csv->fields(); 
print $csv->error_diag(); 
print Dumper(\@details); 

Результирующий выход:

$VAR1 = [ 
     '09/11/2016 22:05:00 +0000', 
     'search_name="ThreatInjection - Rule"', 
     'search_now=1473644880.000', 
     'search="bunchof|stuff1', 
     'bunch%of-stuff2"', 
     'count=100' 
    ]; 

Итак, попросите, чтобы получить поиск = "bunchof | stuff1, гроздь% из-stuff2", чтобы остаться в одном поле. Я уверен, что ответ прост, но, тем не менее, немного тупик. Любая помощь оценивается.

ответ

1

Вы можете использовать с Text::ParseWords, который был включен в стандартное распределение Perl с навсегда.

#!/usr/bin/perl 

use strict; 
use warnings; 
use Text::ParseWords; 
use Data::Dumper; 

my $str3 = '09/11/2016 22:05:00 +0000, search_name="ThreatInjection - Rule", search_now=1473644880.000, search="bunchof|stuff1,bunch%of-stuff2", count=100'; 

my @details = parse_line(',\s*', 1, $str3); 

print Dumper \@details; 

Выход:

$VAR1 = [ 
      '09/11/2016 22:05:00 +0000', 
      'search_name="ThreatInjection - Rule"', 
      'search_now=1473644880.000', 
      'search="bunchof|stuff1,bunch%of-stuff2"', 
      'count=100' 
     ]; 
+0

Спасибо за быстрый и простой ответ. Получил себя так глубоко в одной коробке, что я не думал смотреть в другую. –