2016-04-11 2 views
-4

ファイルサイズが非常に大きい場合、perlでファイルを開くには時間がかかります。ファイルの最初/最後の10行しか必要としない場合は、メモリ内のファイル全体を解析し、それらの行を取得することが最適な解決策ではないはずです。 私はこの目的のためにqx {head filename}を使うことができます。 CPANのような他の方法はありますか?最初の10行をファイルから開かずに(perlで)取得する最善の方法は何ですか?

+7

「開かない」正気の要件ではありません。一度にすべてをメモリに読み込まないことは、おそらくあなたが望み、必要とするものです。 – tripleee

+0

また、基準を指定しない "最高"は、意見を出し合った議論を招きます。あなたが必要としていること、理由、あるいは「十分に良い方法」のために解決することを教えてください。 – tripleee

+0

可能な複製http://stackoverflow.com/questions/303053/how-can-i-read-lines-from-the-end-of-file-in-perl - あなたがいったんあなたがそれを持っています。 – tripleee

答えて

1

これを試してください。 <$fh>ファイルの次の行を返します。だから、ループで反復する。このように、あなたがファイルを開く必要が

my @ar; 
open my $handler,'<',"split.py" or die $!; 
push @ar, scalar <$handler> for 1 .. 2; 
print @ar; 
4

に従い、リミットまで行ずつそれを読むよう

open my $fh,'<',"file" or die $!; 
print scalar <$fh> for 1 .. 10; 

あなたは、変数試しに出力を保存したい:

use strict; 
use warnings; 

my $count = 1; 

open my $fh, '<', 'huge_filename' or die $!; 
while(<$fh>) { 
    print; # Or push into array for further processing 
    last if ++$count == 10; 
} 
close $fh; 
+0

$ countの代わりに$を使うこともできます。既にあなたのための行番号を持っていました。 – senorsmile

2

ファイルを開くことなくファイルからデータを取得することはできません。また、ファイルを開く時間もファイルサイズに依存しません。

あなただけの最初の10行が必要な場合は、あなたがそれを開く必要があり、10行を読んで、近い:

my @lines; 

open my $fh, '<', $file_name; 
for (1..10) { 
    my $line = <$fh>; 
    chomp $line; # optional, remove "\n" from end of line 
    push @lines, $line; 
} 
close $fh; 
0

他の方法ですそれだけで読むために十分に簡単ですメモリへの最初の10行:

use strict; 
use warnings; 
use 5.020; 
use autodie; 
use Data::Dumper; 

open my $OUTFILE, '>', 'data.txt'; 

for my $i (1..100_000) { 
    say {$OUTFILE} "hello word $i"; 
} 

close $OUTFILE; 

open my $INFILE, '<', 'data.txt'; 

while (my $line = <$INFILE>) { 
    print $line; 
    last if $. >= 10; 
} 

close $INFILE; 

--output:-- 
hello word 1 
hello word 2 
hello word 3 
hello word 4 
hello word 5 
hello word 6 
hello word 7 
hello word 8 
hello word 9 
hello word 10 

これはどんなCPANも好きですか?メモリにのみ最後の10行を読み取るための

use File::ReadBackwards; 

open my $INFILE, '<', 'data.txt'; 
my $backwards_file = File::ReadBackwards->new('data.txt'); 

my $i = 1; 
while (my $line = $backwards_file->readline) { 
    print $line; 
    last if ++$i > 10; 
} 

close $INFILE; 

--output:-- 
hello word 100000 
hello word 99999 
hello word 99998 
hello word 99997 
hello word 99996 
hello word 99995 
hello word 99994 
hello word 99993 
hello word 99992 
hello word 99991 
関連する問題