将CSV文件分成键和数组

时间:2015-11-22 20:37:58

标签: arrays perl

我是perl的新手,我试图将一个csv文件(每行有10个以逗号分隔的项目)分成一个键(第一项)和一个数组(9项)放入一个哈希。最后,我想使用if函数将另一个变量与散列中的键匹配,并打印出数组中的元素。

这是我的代码,它不能正常工作。

use strict;
use warnings;

my %hash;

my $in2 = "metadata1.csv";
open IN2, "<$in2" or die "Cannot open the file: $!";
while (my $line = <IN2>) {
    my ($key, @value) = split (/,/, $line, 2);
    %hash = (
    $key => @value
);
}

foreach my $key (keys %hash)
{
  print "The key is $key and the array is $hash{$key}\n";
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

不要使用2作为split的第三个参数:它会将行分割为仅两个元素,因此只有一个@value。

此外,通过执行%hash =,您将在循环的每次迭代中覆盖散列。只需添加一个新的键/值对:

$hash{$key} = \@value;

请注意\符号:您不能将数组直接存储为哈希值,您必须存储对它的引用。打印值时,您必须取消引用

#! /usr/bin/perl
use warnings;
use strict;

my %hash;
while (<DATA>) {
    my ($key, @values) = split /,/;
    $hash{$key} = \@values;
}

for my $key (keys %hash) {
    print "$key => @{ $hash{$key} }";
}

__DATA__
id0,1,2,a
id1,3,4,b
id2,5,6,c

如果您的CSV文件包含带引号或转义的逗号,则应使用Text::CSV