在Perl中将第一个文件的头添加到所有其他拆分文件中

在Perl中将第一个文件的头添加到所有其他拆分文件中,perl,Perl,我需要将第一个主文件的头添加到所有拆分文件中。i、 我可以得到第一个分割文件的头,但我需要它的所有分割文件,这里我分割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, $

我需要将第一个主文件的头添加到所有拆分文件中。i、 我可以得到第一个分割文件的头,但我需要它的所有分割文件,这里我分割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;
#!usr/bin/perl-w
我的$chunksize=25000000;#25MB
我的$filenumber=0;
my$infle=“Test.dat”;
我的$outsize=0;
我的$eof=0;
我的$line=$\ux;
打开infle,$infle;
打开OUTFILE,“>OUTFILE..”$filenumber.“.dat”;
而(){
咀嚼;
如果($outsize>$chunksize){
关闭输出口;
$supersize=0;
$filenumber++;
打开(OUTFILE,“>OUTFILE.”..$filenumber.“.dat”)
或者死在“无法打开输出文件”.$filenumber.“.dat”;
}
打印输出文件“$\n”;
$OVERSIZE+=长度;
}
封闭填充;

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

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;
}
使用严格;
使用警告;
使用自动模具;
#初始化。。。
打开我的$in,,“outfile${file_number}.dat”;
我的$header=#保存标题。。。
chomp$header;#。。。不完全必要
而(){
chomp;#严格说来没有必要
如果($outsize>$chunksize){
收尾美元;
$supersize=0;
$filenumber++;
打开$out,'>',“outfile${file_number}.dat”;
打印$out$头文件“\n”#在文件开头打印头文件
#如果$header被选中,则需要换行符
}
打印$out$u200;,“\ n”#如果选择$200;则需要换行符
$OVERSIZE+=长度;
}

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

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;
}
使用严格;
使用警告;
使用自动模具;
#初始化。。。
打开我的$in,,“outfile${file_number}.dat”;
我的$header=#保存标题。。。
chomp$header;#。。。不完全必要
而(){
chomp;#严格说来没有必要
如果($outsize>$chunksize){
收尾美元;
$supersize=0;
$filenumber++;
打开$out,'>',“outfile${file_number}.dat”;
打印$out$头文件“\n”#在文件开头打印头文件
#如果$header被选中,则需要换行符
}
打印$out$u200;,“\ n”#如果选择$200;则需要换行符
$OVERSIZE+=长度;
}
  • 您应该始终
    使用警告
    (优先于命令行
    -w
    )和
    使用严格的
    。这样,许多简单的错误,您可能已经obverlook将被标记

  • 将三参数形式的
    open
    与词法文件句柄一起使用

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

  • 使用
    将常量
    pragma作为Perl变量来定义常量值

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

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

如果在有新数据要写入且没有打开的文件时
打开
输出文件,并且在文件已满或已到达输入数据末尾时
关闭
输出文件,则更容易跟踪输出文件

该程序演示了这些想法,并完成了所需的工作

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;
  }
}
使用严格;
使用警告;
使用常量infle=>Test.dat';
使用常量CHUNKSIZE=>25_000_000;#25MB
打开我的$infh、、$outfile或die“无法打开$outfile:$!”;
打印{$outph}$header;
$filenumber++;
}
打印{$outph}$行;
如果(告诉$OUTH>CHUNKSIZE或eof$infh){
关闭$outph或死亡$!;
undef$OUTH;
}
}
  • 您应该始终
    使用警告
    (优先于命令行
    -w
    )和
    使用严格的
    。这样,许多简单的错误,您可能已经obverlook将被标记

  • 将三参数形式的
    open
    与词法文件句柄一起使用

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

  • 使用
    将常量
    pragma作为Perl变量来定义常量值

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

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

如果在有新数据要写入且没有打开的文件时
打开
输出文件,并且在文件已满或已到达输入数据末尾时
关闭
输出文件,则更容易跟踪输出文件

该程序演示了这些想法,并完成了所需的工作

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;
  }
}
使用严格;
使用警告;
使用常量infle=>Test.dat';
使用常量CHUNKSIZE=>25_000_000;#25MB
打开我的$infh、、$outfile或die“无法打开$outfile:$!”;
打印{$outph}$header;
$filenumber++;
}
打印{$outph}$行;
如果(告诉$OUTH>CHUNKSIZE或eof$infh){
关闭$outph或死亡$!;
undef$OUTH;
}
}

假设块大小较小,您能给我们提供示例输入和预期输出吗?请添加pragma
使用strict到你的脚本你能给我们一个例子输入和预期输出,假设一个较小的块大小吗?请添加pragma
使用strict到您的脚本我将避免咀嚼,这样您在打印时就不需要“\n”out@justintime:因此,如果打印时不需要“\n”,则“非严格必需”注释可以避免咀嚼out@justint