我试图在Perl6中逐行读取一个巨大的gz文件。
我正在尝试做这样的事情
my $file = 'huge_file.gz';
for $file.IO.lines -> $line {
say $line;
}
但这给我一个错误的UTF-8格式的错误。我看不到如何从帮助页面https://docs.perl6.org/language/unicode#UTF8-C8或https://docs.perl6.org/language/io
中读取压缩后的材料我想完成与Perl5中相同的操作:http://blog-en.openalfa.com/how-to-read-and-write-compressed-files-in-perl
如何在Perl6中逐行读取gz文件?
谢谢
答案 0 :(得分:11)
为此,我建议使用模块conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3))
while True:
raw_data, addr = conn.recvfrom(65536)
print(' SIZE = {}'.format(len(raw_data)))
。您可以找到readme and code on github并与Compress::Zlib
一起安装。
此示例摘自标题为“ wrap”的3号测试文件:
zef install Compress::Zlib
这可能是获得所需东西的最简单方法。
答案 1 :(得分:7)
在Archive::Libarchive模块中使用read-file-content
方法,但是我不知道该方法是否一次将所有行读入内存:
use Archive::Libarchive;
use Archive::Libarchive::Constants;
my $a = Archive::Libarchive.new: operation => LibarchiveRead, file => 'test.tar.gz';
my Archive::Libarchive::Entry $e .= new;
my $log = '';
while $a.next-header($e) {
$log = get-log($a,$e) if $e.pathname.ends-with('.txt');
}
sub get-log($a, $e) {
return $a.read-file-content($e).decode('UTF8-C8');
}
答案 2 :(得分:6)
如果您正在寻找快速解决方案,则可以从gzip进程的stdout管道中读取以下行:
my $proc = run :out, "gzip", "--to-stdout", "--decompress", "MyFile.gz"
for $proc.out.lines -> $line {
say $line;
}
$proc.out.close;