簡體   English   中英

在gzip文件Perl中讀取和查找

[英]Read & Seek in gzip files Perl

我試圖讀取給定的gzip / plain xml文件集,並根據給定的偏移量和長度值將這些文件的某些部分打印到輸出xml文件中。

偏移值是哈希%offhash的鍵,而相應的鍵是length。

這是我用於生成輸出文件的功能-

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文件時,會產生一些緩沖問題 在這種情況下,輸出文件包含來自某些先前讀取的input( .gz)文件的數據。

似乎問題就在這里

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

誰能幫我解決這個問題?

提前致謝。

您只能在常規文件中查找,而不能在程序或STDIN等的輸出中查找。如果要執行此操作,則需要自己添加一個緩沖層,但請注意,可能只需要緩沖整個未壓縮的文件即可。能夠尋找它。

即使您不使用外部程序進行Gunzip壓縮,而是使用IO :: Gzip之類的東西,您也將無法找到,因為gzip(和其他壓縮方式)的固有工作方式是您需要讀取所有之前的數據以便能夠在當前文件位置解壓縮數據。 有很多方法可以限制以前需要的數據量,但是隨后您需要專門准備gzip文件,它將變得更大。 我目前尚不知道有哪個模塊可以實現此功能,但是我做了一次概念驗證,因此我知道它可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM