如何在Perl6中逐行读取gz文件

时间:2019-01-02 17:57:13

标签: perl6

我试图在Perl6中逐行读取一个巨大的gz文件。

我正在尝试做这样的事情

my $file = 'huge_file.gz';
for $file.IO.lines -> $line {
    say $line;
}

但这给我一个错误的UTF-8格式的错误。我看不到如何从帮助页面https://docs.perl6.org/language/unicode#UTF8-C8https://docs.perl6.org/language/io

中读取压缩后的材料

我想完成与Perl5中相同的操作:http://blog-en.openalfa.com/how-to-read-and-write-compressed-files-in-perl

如何在Perl6中逐行读取gz文件?

谢谢

3 个答案:

答案 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;