我在编写和正确读取由名称(键)和值数组组成的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];
答案 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了。