如何通过逗号将字符串拆分为数组但忽略双引号内的逗号?

neb*_*lus 0 regex csv arrays perl

我有一条线:

$string = 'Paul,12,"soccer,baseball,hockey",white';
Run Code Online (Sandbox Code Playgroud)

我试着将其拆分为具有4个值的@array

print $array[2];
Run Code Online (Sandbox Code Playgroud)

soccer,baseball,hockey

我怎么这样?救命!

sin*_*ish 11

只需使用Text :: CSV即可.正如您从源代码中看到的那样,正确地进行CSV解析非常复杂:

sub _make_regexp_split_column {
    my ($esc, $quot, $sep) = @_;

    if ( $quot eq '' ) {
        return qr/([^\Q$sep\E]*)\Q$sep\E/s;
    }

   qr/(
        \Q$quot\E
            [^\Q$quot$esc\E]*(?:\Q$esc\E[\Q$quot$esc\E0][^\Q$quot$esc\E]*)*
        \Q$quot\E
        | # or
        [^\Q$sep\E]*
       )
       \Q$sep\E
    /xs;
}
Run Code Online (Sandbox Code Playgroud)

  • 有许多方法可以安装没有安装权限的模块.请参阅http://stackoverflow.com/questions/251705/how-can-i-use-a-new-perl-module-without-install-permissions.此外,如果模块是纯perl,您可以简单地将它放在与脚本相同的目录中,或者将它放在您可以访问的某个目录中并使用`use lib'目录"`contruct,请参阅perldoc.perl.org /lib.html. (2认同)

oyl*_*gul 7

标准模块Text :: ParseWords也会这样做.

my @array = parse_line(q{,}, 0, $string);
Run Code Online (Sandbox Code Playgroud)


Joe*_*ger 5

响应如何使用 Text::CSV(_PP) 执行此操作。这是一个快速的。

#!/usr/bin/perl

use strict;
use warnings;

use Text::CSV_PP;
my $parser = Text::CSV_PP->new();

my $string = "Paul,12,\"soccer,baseball,hockey\",white";

$parser->parse($string);
my @fields = $parser->fields();

print "$_\n" for @fields;
Run Code Online (Sandbox Code Playgroud)

通常一个人会安装Text::CSVText::CSV_PP通过该cpan实用程序。

为了解决您无法安装模块的问题,我建议您使用“纯 Perl”实现,以便您可以“安装”它。假设您将Text::CSV_PP源的文本复制到名为CSV_PP.pmText与脚本相同的目录中创建的文件夹中命名的文件中,上述示例将起作用。您也可以将它放在其他位置并使用use lib 'directory'前面讨论过的方法。请参阅此处此处以查看使用 CPAN 模块绕过安装限制的其他方法。