将第一个文件的标题添加到Perl中的所有其他分割文件中

问题描述:

我需要将第一个主文件的标题添加到所有分割文件中。即我能够获得第一个分割文件的标题,但我需要它为所有分割文件,在这里我分裂DAT文件。下面是我已经为这样做:将第一个文件的标题添加到Perl中的所有其他分割文件中

#!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; 
+2

你能不能给我们的示例输入和预期的输出,假设一个较小的块大小? – amon

+1

请将编辑'use strict;'加入您的脚本 –

您需要将头从输入文件存储和打印的每一个新的文件打开时:

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; 
} 
+0

我会避免ch then,那么当您打印出来时您不需要“\ n” – justintime

+0

@justintime:因此'不是必须的'评论 – Zaid

  • 你应该总是use warnings(优先于命令行-w)和use strict。这样,很多简单的错误,你原本可能obverlooked将被标记

  • 使用open与词法文件句柄

  • 三个参数的形式检查的结果所有打开调用和包含值标记错误在一个die$!

  • 定义use constant编译父亲常值比像Perl变量

  • 打印到文件句柄的字节数可以使用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; 
    } 
} 
+0

+1:比我自己更完整。 – Zaid

+0

Woww ....多数民众赞成在精彩!!! ...这真的节省了我的时间。非常感谢Borodin,Zaid和所有人。 – ducati1198