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字句ファイルハンドルでの3パラメータ形式を使用します

  • 開いているすべての呼び出しの結果を確認$!し、die文字列にの値を含むエラーにフラグを立てます

  • 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 に答える