2016-08-20 9 views
0

私はperlの新機能です。私は、ファイルから要素を読み込んで1次元配列に格納したいと思います。たとえば、.csvから1dの配列への読み込み - perl

1,6,1,0   
2,3,0,0   
3,2,0,0 

my $filename = $ARGV[0]; 
open(my $filehandle, '<', $filename) or die "Could not open $filename\n"; 
# 
my @resultarray; 
while(my $line = <$filehandle>){ 
    my @linearray = split("/n", $line); 
} 
while(foreach(@linearray){ 
    my @resultarray = split(",", $linearray); 
} 

この方法は問題ありませんか? 2次元配列に読みたいなら、それは簡単でしょうか?

ありがとうございます!

答えて

1

私はあなたが必要以上にコードを持っていると思います。 whileループ内では、一度に1行ずつ読み込んでいます。すべての処理を行います。

事前に@linearrayをビルドすると、あなたの例では何も購入せず、不要なメモリを使い果たします。データを@resultarrayにプッシュする前にソートする場合は、そのようにするための正当な理由があるかもしれませんが、必要がない場合は余分なデータ構造を避けるのが最善です。心の中で

my $filename = $ARGV[0]; 
open my $filehandle, '<', $filename or die "Could not open $filename\n"; 

my @resultarray; 
while(<$filehandle>) { 
    chomp; 
    my @linearray = split /,/; 

    ## What did you want to do here, just add them to @resultarray? 

    push @resultarray, @linearray; 
} 

ベアリングは、1つのステップでそれを行っている可能性:

push @resultarray, split /,/; 

あなたのファイルハンドルを閉じることを忘れないでください。

close $filehandle; 

これは、コンマ区切りのファイルを処理する方法であると言われています。ファイルが本当にCSV(フィールドはカンマ、文字を返すことができます)の場合、実際にはText::CSVを使用して、そのすべての不幸を処理します。

-1
open IN,$filename || die "$!"; 
my @res=(); 
while(defined($line=<IN>)){ 
    chomp($line); 
    @info=split(/,/,$line); 
    push(@res,[@info]); 
} 
print $res[1][1]; 
close IN; 
関連する問題