在混合字符串上使用嵌入引号解析 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'
];
我环顾四周,但找不到解决这个问题的有效解决方案。我一直在尝试使用 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'
];