在混合字符串上使用嵌入引号解析 CSV

Parse CSV with embedded quotes on mixed string

我环顾四周,但找不到解决这个问题的有效解决方案。我一直在尝试使用 TEXT:CSV_XS 所以这不仅仅是用正则表达式做一些困难的事情。我可能无法轻松安装TEXT::CSV,但我有XS版本

我只需要解析成 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'
    ];

因此,要求是让 search="bunchof|stuff1,bunch%of-stuff2" 保留在一个字段中。我相信答案很简单,但是,有点难倒none 少。任何帮助表示赞赏。

你可以用 with 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'
        ];