在 gzip 文件中读取和查找 Perl



我正在尝试读取给定的GZIP/普通XML文件,并根据给定偏移量和长度值将这些文件的某些部分打印到输出XML文件中。

偏移值是哈希%offhash的键,相应的键是长度。

这是我用于生成输出文件的功能 -

sub fileproc {
   my $infile = shift;
   my $outfile = shift;
   my $FILEH;
   $| = 1;
    $outfile =~ s/.gz$//;
   if($infile =~ m/.gz$/i){
       open( $FILEH,"gunzip -c $infile | ") or die "Could not open input $infile";
   }
   else{
       open( $FILEH, "<", $infile) or die "Could not open input $infile";
   }
   open(my $OUTH, ">", $outfile) or die "Couldn't open file, $!";
   foreach my $offset (sort{$a <=> $b} keys %offhash)
   {
       my $record="";
       seek ($FILEH, $offset, 0);
       read ($FILEH, $record, $offhash{$offset}, 0);
       print $OUTH "$record";
   }
    close $FILEH;
    close $OUTH;
}

此功能适用于普通XML输入文件,但是当输入文件集中有一些(或全部) .xml.gz文件时,创建一些缓冲问题。在这种情况下,输出文件包含一些以前的读取输入( .gz)文件的数据。

看来问题在线 -

open( $FILEH,"gunzip -c $infile | ") or die "Could not open input $infile";

任何人可以帮助我解决这个问题吗?

预先感谢。

您只能在常规文件中查找,而不是程序或stdin等。如果要这样做,则需要自己添加一个缓冲层,但请注意,您可以为了使整个未压缩的文件都需要在其中寻找整个未压缩文件。

即使您不使用外部程序进行枪齐普,但是使用IO :: gzip之类的东西,您将无法寻找,因为固有的gzip(和其他压缩)的工作方式是您需要阅读全部以前的数据能够在当前文件位置下解压缩数据。有一些方法可以限制必要的先前数据的数量,但是您需要专门准备GZIP文件,并且它将变得更大。我不知道目前实现此功能的任何模块,但我曾经做过概念证明,所以我知道它有效。

最新更新