Perl将文本文件拆分为块

时间:2012-07-30 09:47:22

标签: perl

我有一个由数千篇文章组成的大型txt文件,我正在尝试将其拆分为单个文件 - 每篇文章都有一篇文章,我想保存为article_1,article_2等。每篇文章都以一篇文章开头包含单词/ DOCUMENTS /的行。 我对perl完全陌生,任何见解都会非常棒! (甚至是关于良好文档网站的建议)。非常感谢。 到目前为止,我试过的是:

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

my $id = 0;
my $source = "2010_FTOL_GRbis.txt";
my $destination = "file$id.txt";

open IN, $source or die "can t read $source: $!\n";

while (<IN>)
  {
    {  
      open OUT, ">$destination" or die "can t write $destination: $!\n";
      if (/DOCUMENTS/)
       {
         close OUT ;
         $id++;
       }
    }
  }
close IN;

2 个答案:

答案 0 :(得分:4)

假设/DOCUMENTS/单独出现在一条线上。因此,您可以将记录分隔符。

use English     qw<$RS>;
use File::Slurp qw<write_file>;
my $id     = 0;
my $source = "2010_FTOL_GRbis.txt";

{   local $RS = "\n/DOCUMENTS/\n";
    open my $in, $source or die "can t read $source: $!\n";
    while ( <$in> ) { 
        chomp; # removes the line "\n/DOCUMENTS/\n"
        write_file( 'file' . ( ++$id ) . '.txt', $_ );
    }
    # being scoped by the surrounding brackets (my "local block"),
    close $in;    # an explicit close is not necessary
}

备注:

  • use English声明全局变量$RS。它的“杂乱名称”是$/。请参阅perldoc perlvar
  • 行分隔符是默认 记录 分隔符。也就是说,文件读取的标准单位是记录。这只是默认的“行”。
  • 正如您在链接文档中所见,$ RS只接受文字字符串。因此,使用文章之间的划分'/DOCUMENTS/'本身就在一条线上的想法,我指定了newline + '/DOCUMENTS/' + newline。如果这是在行上某处出现的路径的一部分,那么该特定值将不适用于记录分隔符。

答案 1 :(得分:2)

您是否阅读过Programming Perl?这是最好的开始书!

我不明白你想做什么。我假设您有包含文章的文本,并希望将所有文章放在单独的文件中。

use warnings;
use strict;
use autodie qw(:all);

my $id          = 0;
my $source      = "2010_FTOL_GRbis.txt";
my $destination = "file$id.txt";

open my $IN, '<', $source;
#open first file
open my $OUT, '>', $destination;

while (<$IN>) {
    chomp;    # kill \n at the end
    if ($_ eq '/DOCUMENTS/') {  # not sure, am i right here or what you looking for
        close OUT;
        $id++;
        $destination = "file$id.txt";
        open my $OUT, '>', $destination;
    } else {
        print {$OUT} $_, "\n";     # print into file with $id name (as you open above)
    }
}
close $IN;