2012-02-14 21 views
1

perlを使用してファイルの行のいくつかのパターンに基づいて非常に大きなファイルを多くの小さなファイルに分割する方法を教えてください。ファイル解析のためのperlコード

Ex。ファイル:

CONECT 592 593 594               
CONECT 595 596 597               
CONECT 597 598                 
END     
CONECT 591 593 594               
CONECT 595 596 596               
CONECT 597 598                 
END 
CONECT 592 593 594               
CONECT 594 596 598               
CONECT 597 598                 
END   

私は多くのseprateファイルを1つのファイルで作成する必要があります。出力ファイルの開始行は、 'CONECT' &最終行は 'END'にする必要があります。それは大きいファイル(1GB)です

答えて

0
#!/usr/bin/perl 
use strict; 
my $file1='file_2b_read.txt'; 
my $File2='newfile_2b_created.txt'; 
open(CMD, "<$file1") or die "$!"; 
open OUTPUT, ">$File2"; 
my $cnt=1; 
while(<CMD>) { 

    print OUTPUT $_;  

    /^END/ and do { 
     #create new file 
     $cnt++; 
     close(OUTPUT); 
     $File2='newfile_2b_created'.$cnt.'.txt'; 
     open OUTPUT, ">$File2"; 
     next; 
    }; 
} 
close(CMD); 

これは

+0

ありがとうございます、これは私の要件として非常に良いコードです... – navneetcverma

+0

閉じると、偽の空の最終ファイルが作成されますが... – zgpmax

+0

もしそうなら、答えを受け入れてスレッドを閉じます – run

0

これは小さな孤独です、あなたが試すことができます。明示的なコードが必要な場合はお知らせください。

while (<FD>) 
{ 
    if ($_ =~ /^END/) 
    { 
     # save buffer in new file. 
     # reset buffer. 
    } 
    # add line to buffer. 
} 
1

に、より現代的なPerlの使用方法と少しクリーンバージョンをあなたを助けることを願っています(lexcialファイルハンドルでオープン3つのパラメータ、エラーがopenへの呼び出しのチェック)

#!/usr/bin/perl 

use strict; 
use warnings; 

my $in_file = 'file_2b_read.txt'; 
my $out_file = 'newfile_2b_part_%06d.txt'; # Template for output filenames 
my $counter = 1; 

open my $in_fh , '<' , $in_file or die $!; 
open my $out_fh , '>' , sprintf($out_file , $counter) or die $!; 

while(<$in_fh>) { 
    print $out_fh $_; 

    if(/^END/) { 
    close($out_fh) ; 
    open $out_fh , '>' , sprintf($out_file , ++$counter) or die $!; 
    } 
} 

# cleanup afterwards 
close $out_fh ; 
close $in_fh ; 
+0

閉じる偽の空の最終ファイルを作成する... – zgpmax

1

dgwの回答に基づいていますが、偽の最終ファイルを作成しないように変更しました:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $in_file = 'file_2b_read.txt'; 
my $out_file_template = 'newfile_2b_part_%06d.txt'; 
my $counter = 1; 

open my $in_fh , '<' , $in_file or die $!; 
my $out_fh; 

while (<$in_fh>) { 
    if (!$out_fh) { 
     open $out_fh , '>' , sprintf($out_file_template, $counter++) or die $!; 
    } 
    print $out_fh $_; 

    if (/^END/) { 
     close($out_fh); 
     $out_fh = undef; 
    } 
} 

# cleanup afterwards 
if ($out_fh) { close($out_fh) } 
close $in_fh; 
関連する問題