Read&;在gzip文件中查找Perl
我试图读取给定的一组gzip/plain xml文件,并根据给定的偏移量和长度值将这些文件的某些部分打印成输出xml文件 偏移值是哈希%offhash的键,对应的键是长度 这是我用来生成输出文件的函数-Read&;在gzip文件中查找Perl,perl,buffer,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){
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;
}
有人能帮我解决这个问题吗
提前感谢。您只能在常规文件中查找,而不能在程序或STDIN等的输出中查找。如果您想这样做,您需要自己添加一个缓冲层,但请注意,您可能需要缓冲整个未压缩文件,以便能够在其中查找
即使您不使用外部程序压缩,但使用IO::Gzip之类的东西,您也无法查找,因为Gzip(和其他压缩)的固有工作方式是,您需要读取所有以前的数据,以便能够在当前文件位置解压缩数据。有很多方法可以限制以前需要的数据量,但是接下来需要专门准备gzip文件,它会变得更大。我不知道目前有哪个模块实现了这个功能,但我做过一次概念验证,所以我知道它是有效的。这个文件处理程序是由
open($FILEH,“gunzip-c$infle |”)给出的吗
可以查看吗?顺便说一句,我认为使用Perl模块(如)是解决问题的更好方法。tell
在流上工作。只要你只需要seek
forward,你就可以在tell
和read
方面模拟seek
。感谢Steffen,我知道在IO::Gzip中还没有seek函数,这就是为什么要在pipe中尝试它的原因。Seek在我只使用一个gz文件作为输入时工作,但在使用多个输入文件时出现问题。。现在我知道为什么了…感谢暴民们在这里帮助我。我是你的忠实粉丝。。告诉和阅读的结合代替了寻找作品!!虽然我不确定这是否和seek一样快,但它没有seek那么快,也不可能。正如我所说,要获得压缩文件中的后期数据,需要先解压缩所有数据(这是读取所做的),而这肯定没有设置新文件位置那么快。
open( $FILEH,"gunzip -c $infile | ") or die "Could not open input $infile";