2009-07-09 18 views
-1

我必須寫和讀正確值的名稱(鍵)組成的CSV文件和數組的一個問題:在Perl中,如何編寫和讀取由鍵和數組組成的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

鍵中是否有空格? – 2009-07-09 14:07:58

+0

沒有任何理由可以使YAML文件成爲有用的建議,並且這是一個建議它的膝蓋反應。世界上很少有人瞭解YAML,但其中許多人都瞭解CSV。在這種情況下,YAML沒有任何好處。 – 2009-07-13 22:00:46

回答

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 
+0

非常感謝! – YoDar 2009-07-12 12:24:24

4

Sinan Unur's solution是好的,正確的,但我認爲OP的問題是一個XY Problem。他特別要求閱讀和存儲CSV文件中的數據。既然這似乎是真正的目標,那麼最好的解決方案就是利用重用,並在Perl中安裝Text::CSV。它完成了處理CSV文件的繁重工作,爲您提供了引用所有數據的方式,並提供了一個很好的API。

如果這不會浮上你的船,你可以試試DBD::CSV,它與DBI一起使你能夠使用SQL來查詢/插入/更新CSV。如果你習慣使用SQL,那麼這也是一個很好的方法。

編輯:

基於數據的簡單自然,如果你真的想推出自己的,他的解決方案是一個很好的,已經給它+1。