1

我需要将第一个主文件的标题添加到所有拆分文件中。即我能够获取第一个拆分文件的标题,但我需要所有拆分文件的标题,这里我正在拆分 DAT 文件。以下是我这样做的目的:

#!usr/bin/perl -w

my $chunksize  = 25000000; # 25MB
my $filenumber = 0;
my $infile     = "Test.dat";
my $outsize    = 0;
my $eof        = 0;

my $line = $_;

open INFILE, $infile;
open OUTFILE, ">outfile_".$filenumber.".dat";

while (<INFILE>) {
    chomp;

    if ($outsize > $chunksize) {

        close OUTFILE; 
        $outsize = 0;
        $filenumber++;

        open (OUTFILE, ">outfile_".$filenumber.".dat")
            or die "Can't open outfile_".$filenumber.".dat";

    }

    print OUTFILE "$_\n";
    $outsize += length;
}
close INFILE;
4

2 回答 2

4
  • 您应该始终 use warnings(优先于命令行-w)和 use strict. 这样,您可能会忽略的许多简单错误将被标记

  • open使用带有词法文件句柄的三参数形式

  • 检查所有打开调用的结果并标记包含字符串$!中的值的错误die

  • 使用pragma 父亲定义量值,而不是作为 Perl 变量use constant

  • 可以使用该tell函数评估打印到文件句柄的字节数,因此无需保留自己的计数

为了解决您的特定问题,您应该阅读并记住输入文件的第一行,并在每次打开新输出文件时将其打印到新的输出文件中

open如果您在有新数据要写入且没有打开文件时跟踪输出文件,以及close当它们已满或已到达输入数据的末尾时,跟踪输出文件会更容易

该程序演示了这些想法并执行了所需的操作

use strict;
use warnings;

use constant INFILE    => 'Test.dat';
use constant CHUNKSIZE => 25_000_000;  # 25MB

open my $infh, '<', INFILE or die $!;

my $header = <$infh>;

my $outfh;
my $filenumber = 0;

while (my $line = <$infh>) {

  unless ($outfh) {
    my $outfile = "outfile_$filenumber.dat";
    open $outfh, '>', $outfile or die "Can't open '$outfile': $!";
    print { $outfh } $header;
    $filenumber++;
  }

  print { $outfh } $line;

  if (tell $outfh > CHUNKSIZE or eof $infh) {
    close $outfh or die $!;
    undef $outfh;
  }
}
于 2012-09-09T12:31:26.857 回答
1

您需要存储输入文件的标题并在每次打开新文件时打印它:

use strict;
use warnings;
use autodie;

# initializations ...

open my $in,  '<', $infile;
open my $out, '>', "outfile_${file_number}.dat";

my $header = <$in>;    # Save the header...
chomp $header;         # ... not strictly necessary

while ( <$in> ) {

    chomp;             # Not strictly necessary

    if ( $outsize > $chunksize) {

        close $out; 
        $outsize = 0;
        $filenumber++;

        open $out, '>', "outfile_${file_number}.dat";

        print $out $header, "\n";    # Prints header at beginning of file
                                     # Newline needed if $header chomped

    }

    print $out $_, "\n";             # Newline needed if $_ chomped
    $outsize += length;
}
于 2012-09-09T12:07:41.683 回答