如何在 CSV 中使用多个分隔符分割一行?

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

文件

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 hashmap
2个回答
1
投票

您可以使用

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

输出:

zoneP
$VAR1 = {
          'zone0' => [
                       [
                         'primaryserver1',
                         'primaryserver2'
                       ]
                     ],
          'zone1' => [
                       [
                         'primaryserver1',
                         'primaryserver2',
                         'primaryserver3'
                       ]
                     ],
          'zone2' => [
                       [
                         'primaryserver1'
                       ]
                     ],
          'zone3' => [
                       [
                         'primaryserver1',
                         'primaryserver2'
                       ]
                     ]
        };
zoneS
$VAR1 = {
          'zone0' => [
                       [
                         'secondaryserver1',
                         'secondaryserver2'
                       ]
                     ],
          'zone1' => [
                       [
                         'secondaryserver1',
                         'secondaryserver2',
                         'secondaryserver3'
                       ]
                     ],
          'zone2' => [
                       [
                         'secondaryserver1'
                       ]
                     ],
          'zone3' => [
                       [
                         'secondaryserver1',
                         'secondaryserver2'
                       ]
                     ]
        };

0
投票

没有理由拆分两次,只需使用正则表达式

or
匹配进行拆分:

my ($zone, @servers) = split(/,|\|/, $_);

say $zone;
say Dumper(@servers);
zone1
$VAR2 = 'primaryserver1';
$VAR3 = 'primaryserver2';
$VAR4 = 'primaryserver3';
$VAR5 = 'secondaryserver1';
$VAR6 = 'secondaryserver2';
$VAR7 = 'secondaryserver3';
© www.soinside.com 2019 - 2024. All rights reserved.