2011-10-26 34 views
4

2次元配列の巨大なCSVファイルを読み込もうとしていますが、2次元配列に分割して1つのステップで保存する方がよいでしょう: 歓声CSVファイルを読み込んで2次元配列に保存する

my $j = 0; 
while (<IN>) 
{ 

    chomp ; 
    my @cols=(); 
    @cols = split(/,/); 
    shift(@cols) ; #to remove the first number which is a line header 
    for(my $i=0; $i<11; $i++) 
    { 
     $array[$i][$j] = $cols[$i]; 
    }   
    $j++;  
} 
+2

ファイルの値はどのようなタイプですか?文字列がある場合(おそらく引用符など)、Text :: CSVモジュールを使う方がよいでしょう。それらが純粋な数である場合、あなたは単純な分割でOKかもしれません。 –

+0

意図的に行を配列の2番目のインデックスにするのか、それとも誤植ですか? –

答えて

3

Cスタイルのforループに到達したことがある場合は、プログラムのデザインを改善できる可能性があります。

while (<IN>) { 
    chomp; 

    my @cols = split(/,/); 
    shift(@cols); #to remove the first number which is a line header 

    push @array, \@cols; 
} 

これは、単純なsplit(すなわち、レコードが何も埋め込まれたカンマを含まない)で処理することができるCSVファイルを持っていることを前提としています。別に

2

あなたがして、あなたのコードを簡素化することができます。

$array[$col][$row]
my @cols = split /,/; 

あなたの割り当ては異例の添字順序を使用しています。それは人生を複雑にする。 配列内の列/行の割り当て順序では、より単純な方法はないと思います。


代替:あなたは配列($array[$row][$col])に添字の順番を逆にした場合 、あなたは使用して考えることができます:

use strict; 
use warnings; 

my @array; 
for (my $j = 0; <>; $j++) # For testing I used <> instead of <IN> 
{ 
    chomp; 
    $array[$j] = [ split /,/ ]; 
    shift @{$array[$j]}; # Remove the line label 
} 

for (my $i = 0; $i < scalar(@array); $i++) 
{ 
    for (my $j = 0; $j < scalar(@{$array[$i]}); $j++) 
    { 
     print "array[$i,$j] = $array[$i][$j]\n"; 
    } 
} 

サンプルデータ

label1,1,2,3 
label2,3,2,1 
label3,2,3,1 

サンプル出力

array[0,0] = 1 
array[0,1] = 2 
array[0,2] = 3 
array[1,0] = 3 
array[1,1] = 2 
array[1,2] = 1 
array[2,0] = 2 
array[2,1] = 3 
array[2,2] = 1 
+0

多くのおかげで私の質問に答えるとそれを説明しています:) – user1014843

12

CSVは自明ではありません。自分でそれを解析しないでください。 のようなモジュールを使用してください。正確で高速に実行できます。 CSV自分自身を解析を心配することなく、@dataにうまく、すべての行を取得します

use strict; 
use warnings; 

use Text::CSV; 

my @data; # 2D array for CSV data 
my $file = 'something.csv'; 

my $csv = Text::CSV->new; 
open my $fh, '<', $file or die "Could not open $file: $!"; 

while(my $row = $csv->getline($fh)) { 
    shift @$row;  # throw away first value 
    push @data, $row; 
} 

関連する問題