当前位置: 首页 > 知识库问答 >
问题:

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

慕容明煦
2023-03-14

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

我正在尝试做这样的事情

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

但是这会给出一个错误,我有一个格式不正确的UTF-8。我看不到如何从帮助页面读取gzip材料https://docs.perl6.org/language/unicode#UTF8-C8或https://docs.perl6.org/language/io

我想完成和在Perl5中一样的事情:http://blog-en . open alfa . com/how-to-read-and-write-compressed-files-in-perl

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

谢谢

共有3个答案

乔丁雨
2023-03-14

如果您正在寻找快速解决方案,您可以从gzip进程的stdout管道中读取以下行:

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

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

$proc.out.close;
吴浩皛
2023-03-14

在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');
}
卫宁
2023-03-14

为此,我建议使用模块< code>Compress::Zlib。你可以在github上找到自述文件和代码,用< code > zef install Compress::Zlib 安装。

示例取自标题为“wrap”的测试文件 3:

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';

这可能是得到你想要的最简单的方法。

 类似资料:
  • 我在Perl6中有一个基本的脚本,它的运行速度非常慢,比确切的perl5翻译慢30倍。 这在Perl5的< code>while中是惯用的。 这是一个非常简单的脚本,它只更改文件中的文本列。这个Perl6脚本在30分钟内运行。Perl5翻译在1分钟内运行。 我试过用Perl6读处理一个大的文本文件,太慢了。(2014-09)和Perl6:处理非常大的文件的最好方法是什么?但是我在这里看不到任何可以

  • 问题内容: 在史前时代(Python 1.4)中,我们做到了: 在Python 2.1之后,我们做到了: 在Python 2.3中获得便利的迭代器协议之前,它可以做到: 我看过一些使用更详细的示例: 这是首选的方法吗? [edit]我知道with语句可以确保关闭文件…但是为什么文件对象的迭代器协议中没有包含该语句呢? 问题答案: 偏爱以下原因的确有一个原因: 我们都为CPython的相对确定性的引

  • 问题内容: 在Java 8中,我看到在Files类中添加了一个名为lines()的新方法,该方法可用于在Java中逐行读取文件。它适用于大文件吗?我的意思是我们可以先加载1000行,然后加载第二组1000行。我有1GB的大文件,能用吗? 有人可以分享代码段的用法吗? 问题答案: 它适用于大文件吗?[…]我有1GB的大文件,能用吗? 据我所知,它也应适用于大文件(但我没有尝试过): 我的意思是我们可

  • 问题内容: 我在Go中找不到功能。我可以弄清楚如何快速编写一个,但是我只是想知道我是否在这里忽略了一些东西。如何逐行读取文件? 问题答案: _注意: 可接受的答案在早期的Go版本中是正确的。 包中有ReadLine函数。 请注意,如果该行不适合读取缓冲区,则该函数将返回不完整的行。如果要始终通过单次调用函数来读取程序中的整行,则需要将该函数封装到自己的函数中,该函数在for循环中进行调用。 之所以

  • 问题内容: 我想遍历整个文件的每一行。一种方法是读取整个文件,将其保存到列表中,然后遍历感兴趣的行。此方法占用大量内存,因此我正在寻找替代方法。 到目前为止,我的代码: 执行此代码将显示错误消息:。 有什么建议么? 目的是计算成对的字符串相似度,这意味着对于文件中的每一行,我要计算每隔一行的距离。 问题答案: 正确的,完全Python的读取文件的方法如下: 该with语句处理文件的打开和关闭,包括

  • 问题内容: 我刚刚开始学习Swift。我有要从文本文件读取的代码,应用程序显示了整个文本文件的内容。如何显示一行一行并多次调用该行? 包含以下内容: 以下是目前的情况。 如果还有另一种方法,请告诉我。将不胜感激。 问题答案: 斯威夫特3.0 该变量应该是数据的每一行。 使用的代码来自: 在用Obj-C编写的iOSSDK中逐行读取文件并使用NSString 查看旧版Swift的编辑历史记录。