Perl-код для разбора файла - PullRequest
1 голос
/ 14 февраля 2012

как я могу разбить очень большой файл на множество маленьких файлов на основе некоторого шаблона в строке файла, используя 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        

Мне нужно сделать много отдельных файлов из одного файла. Начальная строка выходных файлов должна быть 'CONECT', а конечная строка должна быть 'END'. это большой файл (1 ГБ)

Ответы [ 4 ]

1 голос
/ 14 февраля 2012

Основано на ответе 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;
1 голос
/ 14 февраля 2012

Немного более чистая версия с более современным использованием perl (три параметра открываются с лексическими файловыми дескрипторами, проверка ошибок для вызовов 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 голосов
/ 14 февраля 2012
#!/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 голосов
/ 14 февраля 2012

Это маленький алгоритм, вы можете попробовать.Пожалуйста, дайте мне знать, если вам нужен какой-либо явный код для него.

while (<FD>)
{
   if ($_ =~ /^END/)
   {
      # save buffer in new file.
      # reset buffer.
   }
   # add line to buffer.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...