2016-09-14 3 views
1

J'ai regardé autour de moi, mais je ne trouve pas de solution de travail bien rangée pour cela. J'ai essayé d'utiliser TEXT: CSV_XS, donc il ne s'agit pas de faire quelque chose à la dure avec une regex. Je ne peux pas être en mesure d'installer facilement TEXT :: CSV, mais j'ai la version XS. J'ai simplement besoin d'analyser les champs csv, que je décomposerai plus tard en paires kv.Parse CSV avec des guillemets intégrés sur une chaîne mixte

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); 

sortie résultante est:

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

Ainsi, la demande est d'obtenir la recherche = "bunchof | stuff1, tas% de-stuff2" de rester dans un champ. Je suis sûr que la réponse est simple, mais un peu perplexe. Toute aide appréciée.

Répondre

1

Vous pouvez faire avec Text::ParseWords qui a été inclus dans la distribution Perl standard depuis toujours.

#!/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; 

Sortie:

$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

Merci pour la réponse rapide et facile. J'ai été si profond dans une boîte que je ne pensais pas regarder dans l'autre. –