将第一个文件的标题添加到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;
您需要将头从输入文件存储和打印的每一个新的文件打开时:
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;
}
我会避免ch then,那么当您打印出来时您不需要“\ n” – justintime
@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;
}
}
+1:比我自己更完整。 – Zaid
Woww ....多数民众赞成在精彩!!! ...这真的节省了我的时间。非常感谢Borodin,Zaid和所有人。 – ducati1198
你能不能给我们的示例输入和预期的输出,假设一个较小的块大小? – amon
请将编辑'use strict;'加入您的脚本 –