在Perl中,如何编写和读取由密钥和数组组成的CSV文件?

时间:2009-07-09 13:53:49

标签: perl csv

我在编写和正确读取由名称(键)和值数组组成的CSV文件时遇到问题:

testarray.csv

foo1 ,0,0,0,0,1
foo2 ,1,0,0,0,1
foo3 ,3,4,5,6,7
.
.
.

我需要按如下方式表示该文件:

foo#将成为关键,以下五个数字将成为其数组。

进行该操作的简单方法是什么,并将其用于召回(不是使用Dumper)?如何使用特定键的数组中的变量?

,例如,

print $hsh{'foo1'}[4];

2 个答案:

答案 0 :(得分:6)

通常情况下,我会推荐Text::xSV和/或Text::CSV但是对于这样简单的数据,应该使用简单明了的join

#!/usr/bin/perl

use strict;
use warnings;

my %hash = (
    foo1 => [ 0, 0, 0, 0, 1 ],
    foo2 => [ 1, 0, 0, 0, 1 ],
    foo3 => [ 3, 4, 5, 6, 7 ],
);

for my $key ( sort keys %hash ) {
    print join( q{,}, $key, @{ $hash{$key} } ), "\n";
}

__END__

输出:

C:\Temp> ttt
foo1,0,0,0,0,1
foo2,1,0,0,0,1
foo3,3,4,5,6,7

阅读:

#!/usr/bin/perl

use strict;
use warnings;

my %hash;

while ( <DATA> ) {
    chomp;
    last unless /\S/;
    my ($key, @data) = split /,/;
    $hash{$key} = \@data;
}

print $hash{foo2}->[4], "\n";

__DATA__
foo1,0,0,0,0,1
foo2,1,0,0,0,1
foo3,3,4,5,6,7

输出:

C:\Temp> ttt
1

答案 1 :(得分:4)

Sinan Unur's solution是好的和正确的,但我认为OP的问题是XY Problem。他特别询问从CSV文件中读取和存储数据。由于这似乎是真正的目标,因此最好的解决方案是利用重用并在Perl中安装Text::CSV。它完成了处理CSV文件的繁重工作,为您提供了引用所有数据的方法,并提供了一个很好的API。

如果这不会浮动您的船,您可以尝试DBD::CSV,与DBI一起使您能够使用SQL查询/插入/更新CSV。如果您已经习惯了SQL,那么这也是一种很好的方式。

编辑:

基于数据的简单性,如果你真的想要自己推出,他的解决方案是一个很好的解决方案,已经给它+1了。