如何在Perl中读取文件末尾的行?

问题描述 投票:8回答:11

我正在使用Perl脚本来读取CSV文件并进行一些计算。CSV文件只有两列,如下所示。

One Two
1.00 44.000
3.00 55.000

现在此CSV文件很大,可以从10 MB到2GB。

目前,我正在使用700 MB的CSV文件。我试图在记事本中打开此文件,但是它似乎没有软件可以打开它。

我想读取CSV文件中的最后1000行并查看其值。我怎样才能做到这一点?我无法在记事本或任何其他程序中打开文件。

如果编写Perl脚本,则需要处理完整的文件以转到文件末尾,然后读取最后1000行。

还有什么更好的方法吗?我是Perl的新手,任何建议将不胜感激。

我已经搜索了网络,并且有一些脚本,例如File::Tail,但我不知道它们是否可以在Windows上运行?

perl large-files
11个回答
11
投票

在* nix中,您可以使用tail命令。

File::Tail

这将仅将最后1000行写入perl程序。

在Windows上,有tail -1000 yourfile | perl ... gnuwin32程序包都具有unxutils实用程序。


-1
投票

[不依赖尾巴,如果您有$ FILESIZE [2GB?]以上的内存,那么我可能会这样做,然后我会偷懒去做:


-1
投票

您应该绝对使用File :: Tail,或者最好使用另一个模块。它不是脚本,而是模块(编程库)。它可能适用于Windows。就像有人说的那样,您可以在CPAN测试器上进行检查,或者通常只需阅读模块文档或尝试进行检查。


28
投票

tail模块允许您以相反的顺序读取文件。只要您不依赖顺序,就可以轻松获取最后N行。如果是这样,并且所需的数据足够小(在您的情况下应该如此),则可以将最后1000行读入数组,然后File::ReadBackwards


9
投票

这仅与您的主要问题成正比关系,但是当您要检查诸如reverse之类的模块是否在您的平台上工作时,请检查File::Tail的结果。 CPAN Testers中模块页面顶部的链接将您带到

CPAN Search

查看矩阵,您会发现在所有经过测试的Perl版本的Windows上,此模块确实存在问题:

file-tail-header


5
投票

没有尾巴,只有Perl的解决方案不是没有道理的。

一种方法是从文件末尾查找,然后从文件末尾读取行。如果您的行数不足,请从末尾进一步搜索,然后重试。

file-tail-matrix

P.S。更好的标题是“从Perl中的大文件末尾读取行”。


5
投票

我已经在纯Perl上使用以下代码编写了快速向后文件搜索:


2
投票
$ get-x-lines-from-end.pl ./myhugefile.log 200

1
投票

我相信您可以使用Tie :: File模块。看起来这将行加载到数组中,然后您可以获取数组的大小并处理arrayS-ze-1000直到arraySize-1。


0
投票

如果知道文件中的行数,则可以这样做


0
投票

模块是必经之路。但是,有时您可能正在编写一段要在各种机器上运行的代码,而这些机器可能会缺少更加晦涩的CPAN模块。在那种情况下,为什么不只是“尾巴”并将输出从Perl中转储到临时文件?

© www.soinside.com 2019 - 2024. All rights reserved.