如何在 Perl 中使用多个分隔符分割 CSV 中的行

问题描述 投票:0回答:1

zone.csv 如下所示:

====================================================== ==========

zone0,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2

zone1,primaryserver1,primaryserver2,primaryserver3,secondaryserver1|secondaryserver2|secondaryserver3

zone2,primaryserver1,secondaryserver1

zone3,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2

====================================================== ==========

首先是区域,然后列出所有主服务器,以逗号分隔,然后列出所有辅助服务器,以管道分隔。

我需要填写两个哈希值(区域+主服务器)和(区域+辅助服务器)。我需要有关使用带有两个分隔符的 split 函数的帮助。我希望所有主服务器都在一个散列中,所有辅助服务器都在另一个散列中(区域是两个散列的键)。非常感谢您的帮助。

        my %zoneP;
        my %zoneS;
        my $file1 = "zone.csv";
        open (IN1, "$file1") || die "Cannot open $file1\n";

        # Read File
        while (<IN1>)
        {
                chomp($_);
                # all regex - avoid comments and empty lines
                if ( ($_ !~ /^(#)+/) && ( $_ =~ /[a-z A-Z 1-9 \. \[ \] \* \+ ]/) )
                {
                        print "$_\n" if($debug > -1);
                        my ($zone, $serverP, $serverS) = split(",",$_);
                        $zoneP{$zone} = $serverP;
                        $zoneS{$zone} = $serverS;

                }
        }
        close IN1;

我编写了上面的代码,但需要 split 函数的帮助 - 如何使用两个分隔符并在单独的哈希中获取值。

csv perl split hash
1个回答
0
投票

您可以使用

split
两次,首先使用逗号,然后使用竖线。

use warnings;
use strict;

my %zoneP;
my %zoneS;

# Read File
while (<DATA>) {
    chomp($_);
    # all regex - avoid comments and empty lines
    if ( ($_ !~ /^(#)+/) && ( $_ =~ /[a-z A-Z 1-9 \. \[ \] \* \+ ]/) )
    {
        my ($zone, @servers) = split(/,/, $_);
        my $server_s = pop @servers;
        my @servers_s = split(/\|/, $server_s);
        push @{ $zoneP{$zone} }, [@servers];
        push @{ $zoneS{$zone} }, [@servers_s];
    }
}

print "zoneP\n";
use Data::Dumper; $Data::Dumper::Sortkeys=1; print Dumper(\%zoneP);
print "zoneS\n";
use Data::Dumper; $Data::Dumper::Sortkeys=1; print Dumper(\%zoneS);

__DATA__
zone0,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2

zone1,primaryserver1,primaryserver2,primaryserver3,secondaryserver1|secondaryserver2|secondaryserver3

zone2,primaryserver1,secondaryserver1

zone3,primaryserver1,primaryserver2,secondaryserver1|secondaryserver2
© www.soinside.com 2019 - 2024. All rights reserved.