3

我有一个由数千篇文章组成的大型 txt 文件,我正在尝试将其拆分为单独的文件 - 我想保存为 article_1、article_2 等的每篇文章都有一个文件。每篇文章都以包含单词/文档/。我对 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;
4

2 回答 2

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. 如果这是行中某处发生的路径的一部分,则该特定值将不适用于记录分隔符。
于 2012-07-30T13:00:04.683 回答
2

你读过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;
于 2012-07-30T10:02:05.543 回答