如何使用Perl在每个200行的几个文件中拆分5000行的文件?

时间:2015-09-16 10:25:35

标签: perl

我有一个5000行的文件,我想要几个200行的文件,我试过这个:

#!/usr/bin/perl
use strict;
use warnings;
my $targetfile = '200_lines.txt';
my $filename = '5000_lines.txt';

open ( my $DATA, '<', $filename )  or die "Could not open file '$filename': $!";

while ( my $line = <$DATA> ) {
  my $counter++; 

  open (my $FILE, '>>', $targetfile ) or die "Could not open file '$targetfile': $!";
  print $FILE $line;
  close $FILE;
  if ( $counter % 200 == 0
    if ($. % 200 == 0) { 
      $targetfile =~ s/200/$counter/;
    }
}

我的$counter变量仍然是1.我不知道为什么。所以我只得到一个名为200_lines.txt的文件,包含5000行。

3 个答案:

答案 0 :(得分:3)

您可以使用sprintf在每200行后生成新文件名,并使用$.跟踪文件中的行号。

以下脚本将从较大的文件生成较小的文件块,每个文件有200行。

#!/usr/bin/perl
use strict;
use warnings;

open my $rfh,'<','file_5000' or die "unable to open file : $! \n";

my $filecount=0;
my $wfh;
while(<$rfh>){
    if(($.-1) % 200 == 0){
           close($wfh) if($wfh);
           open($wfh, '>', sprintf("file%02d", ++$filecount)) or die $!;
        }
   print $wfh "$_";
}
close($rfh);

答案 1 :(得分:2)

  • $counter的范围在您的while块中。因此每次迭代都会重置。
  • 您不需要这样做,因为您可以针对当前行号测试$.
  • 不要调用您的文件句柄$DATA。有一个名为<DATA>的特殊文件句柄。

怎么样:

#!/usr/bin/perl
use strict;
use warnings;

open( my $input,  '<', '5000_lines.txt' ) or die $!;
open( my $output, '>', '200_lines.txt' )  or die $!;

while ( my $line = <$input> ) {
    unless ( $. % 200 ) {
        close($output);
        open( $output, '>', int( $. / 200 + 2) . "00_lines.txt" ) or die $!;
    }
    print {$output} $line;
}
close($input);
close($output);

这会创建文件:

200_lines.txt
400_lines.txt
600_lines.txt

等。

答案 2 :(得分:0)

您的代码中有很多错误。

#!/usr/bin/perl
use strict;
use warnings;

# Creating a file with 5000 lines
my $filename = '5000_lines.txt';
open ( $DATA, '>', $filename )  or die "Could not open file '$filename': $!";

for (my $i=0;$i<5000;$i++){
    print $DATA "$i\n";
}
close ( $DATA);


my $targetfile = '200_lines.txt';

open ( my $DATA, '<', $filename )  or die "Could not open file '$filename': $!";
my $counter = 0;
my $num = 0;
my $flag = 1;
while ( my $line = <$DATA> ) {
      if ($flag == 1){
          open (FILE, '>', $targetfile.'_'.$num ) or die "Could not open file '$targetfile.'_'.$num': $!";
      }
      print FILE $line;
      $flag=0;
      if ( $counter % 200 == 0){
           $num = $counter/200;
           close FILE;
           $flag=1
       }
      $counter++; 
}
close (FILE);

它会将大文件分成更小的每行200行。