Как читать файл gz построчно в Perl6 - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь прочитать огромный файл gz построчно в Perl6.

Я пытаюсь сделать что-то вроде этого

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

Но это выдает ошибку, которая у меня естьуродливый UTF-8.Я не вижу, как заставить это читать gzipped материал со страницы справки 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

Как я могу читать файл gz построчно в Perl6?

спасибо

Ответы [ 3 ]

0 голосов
/ 03 января 2019

используйте метод read-file-content в модуле Archive :: Libarchive , но я не знаю, считал ли метод все строки сразу в память:

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');
}
0 голосов
/ 04 января 2019

Если вам нужно быстрое решение, вы можете прочитать строки из канала stdout процесса gzip:

my $proc = run :out, "gzip", "--to-stdout", "--decompress", "MyFile.gz"

for $proc.out.lines -> $line {
    say $line;
}

$proc.out.close;
0 голосов
/ 02 января 2019

Я бы рекомендовал использовать для этой цели модуль Compress::Zlib. Вы можете найти readme и код на github и установить его с zef install Compress::Zlib.

Этот пример взят из файла теста № 3 с заголовком "wrap":

use Test;
use Compress::Zlib;

gzspurt("t/compressed.gz", "this\nis\na\ntest");

my $wrap = zwrap(open("t/compressed.gz"), :gzip);
is $wrap.get, "this\n", 'first line roundtrips';
is $wrap.get, "is\n", 'second line roundtrips';
is $wrap.get, "a\n", 'third line roundtrips';
is $wrap.get, "test", 'fourth line roundtrips';

Это, наверное, самый простой способ получить то, что вы хотите.

...