阅读&寻找gzip文件Perl

时间:2014-02-07 04:40:53

标签: perl buffer

我正在尝试读取给定的gzip / plain 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";

有人可以帮我解决这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

你只能在常规文件中搜索,而不能在程序输出或STDIN等中搜索。如果你想这样做,你需要自己添加一个缓冲层,但请注意你可能需要缓冲整个未压缩文件只是为了能够在其中寻找。

即使你没有使用外部程序进行gunzip,但是使用像IO :: Gzip这样的东西你将无法寻找,因为gzip(和其他压缩)的固有方式是有效的,你需要阅读所有内容以前的数据能够解压缩当前文件位置的数据。有很多方法可以限制必要的先前数据量,但是你需要专门准备你的gzip文件,它会变得更大。我不知道目前实现这个的任何模块,但我做了一次概念验证,所以我知道它有效。