从大文本文件中读取单行

时间:2011-08-08 19:37:57

标签: php

我有一个10MB的文本文件 线条的长度可能会有所不同。

从这个文件中只读取一个特定行,哪种方法最快(快速且内存友好)?例如get_me_the_line($nr, $file_resource)

3 个答案:

答案 0 :(得分:6)

如果线条长度不同,我不知道只是跳到线上的方法。但是,如果不将它们用于任何事情,您可以非常快速地遍历行,并返回感兴趣的行。

function ReadLineNumber($file, $number)
{
    $handle = fopen($file, "r");
    $i = 0;
    while (fgets($handle) && $i < $number - 1)
        $i++;
    return fgets($handle);
}

修改

我将- 1添加到循环中,因为它会提前读取一行。因此$number是零索引线参考。如果您更喜欢第1行,则更改为- 2表示文件中的第一行。

答案 1 :(得分:2)

由于线条的长度不同,您必须查看每个字符,因为它可能表示该行的结尾。最快的方法是将文件加载到大小与文件系统的块大小相同的块中,并计算换行符,直到您在所需的行上。 更好的方法是拥有一个索引文件,用于存储有关包含这些行的文件的信息。使用数据库也可能是一个更好的主意。

答案 2 :(得分:1)

如果文件非常大(几GB或更多)并且您的应用程序在* nix上运行,您可能想要尝试让PHP处理该文件,而是使用一些现有的针对其优化的unix工具这种线路处理。一旦此类工具为sed,就可以找到从大文件中打印特定行的示例here

system_exec()调用中包装它应该是微不足道的,或者类似于编写你正在寻找的函数。