gpt4 book ai didi

Perl 只读取特定的 gz 文件行

转载 作者:行者123 更新时间:2023-12-04 04:47:37 29 4
gpt4 key购买 nike

我正在尝试制作一个解析脚本来解析一个巨大的文本文件(超过 200 万行),该文件是 gunzip 压缩的。我只想解析文本文件中的一系列行。到目前为止,我已经使用 zgrep -n 来查找提到我知道将开始和结束我感兴趣的文件部分的字符串的两行。

在我的测试用例文件中,我只想阅读第 123080 到 139361 行。我发现 Tie::File 可以使用它返回的数组对象访问文件行,但不幸的是,这不适用于我的枪压缩文件正在与。

枪压缩文件是否有以下内容?

use Tie::File
tie @fileLinesArray, 'Tie::File', "hugeFile.txt.gz"
my $startLine = 123080;

my $endLine = 139361;
my $lineCount = $startLine;
while ($lineCount <= $endLine){
my $line = @fileLinesArray[$lineCount]
blah blah...
}

最佳答案

Tie::File对于大文件来说是个坏主意,因为它需要一次将整个文件存储在内存中。对于压缩文件来说,这也是一个不切实际的想法,如果不是不可能的话。相反,您将希望对数据的输入流进行操作。如果您要修改数据,则输出流到数据的新副本。 Perl 通过 PerlIO::gzip 对 gzip 压缩提供了很好的支持。层,但您也可以通过一两个 gzip 管道数据过程。

# I/O stream initialization
use PerlIO::gzip;
open my $input, "<:gzip", "data.gz";
open my $output. ">:gzip", "data.new.gz"; # if $output is needed

# I/O stream initialization without PerlIO::gzip
open my $input, "gzip -d data.gz |";
open my $output, "| gzip -c > data.new.gz";
一旦设置了输入(和可选的输出)流,您就可以在它们上使用 Perl 的 I/O 工具,就像任何其他文件句柄一样。
# copy first $startLine lines unedited
while (<$input>) {
print $output $_;
last if $. >= $startLine;
}

while (my $line = <$input>) {
# blah blah blah
# manipulate $line
print $output $line;
last if $. >= $endLine;
}

print $output <$input>; # write remaining input to output stream
close $input;
close $output;

关于Perl 只读取特定的 gz 文件行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53642912/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com