我正在尝试读取给定的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";
有人可以帮我解决这个问题吗?
提前致谢。
答案 0 :(得分:2)
你只能在常规文件中搜索,而不能在程序输出或STDIN等中搜索。如果你想这样做,你需要自己添加一个缓冲层,但请注意你可能需要缓冲整个未压缩文件只是为了能够在其中寻找。
即使你没有使用外部程序进行gunzip,但是使用像IO :: Gzip这样的东西你将无法寻找,因为gzip(和其他压缩)的固有方式是有效的,你需要阅读所有内容以前的数据能够解压缩当前文件位置的数据。有很多方法可以限制必要的先前数据量,但是你需要专门准备你的gzip文件,它会变得更大。我不知道目前实现这个的任何模块,但我做了一次概念验证,所以我知道它有效。