使用PHP在一个巨大的文件中获取一行

Jav*_*cky 7 php

如何在3 gig文本文件中获取特定行.这些行由\n分隔.我需要能够按需获得任何线路.

如何才能做到这一点?只需要返回一行.我不想使用任何系统调用.

注意:其他地方有关于如何在bash中执行此操作的问题.我想将它与PHP等效进行比较.

更新:每条线的长度都是相同的.

Tho*_*rin 8

如果不对文件保留某种索引,则需要读取所有索引,直到遇到x个字符为\n的字符.我看到nickf刚刚发布了一些方法,所以我不再重复了.

要以有效的方式重复执行此操作,您需要构建索引.为某些(或所有)行号存储一些已知文件位置,然后您可以使用fseek搜索到正确的位置.

编辑:如果每一行的长度相同,则不需要索引.

$myfile = fopen($fileName, "r");
fseek($myfile, $lineLength * $lineNumber);
$line = fgets($myfile);
fclose($myfile);
Run Code Online (Sandbox Code Playgroud)

在此示例中,行号为0,因此您可能需要先减去一行.线长包括\n角色.


sal*_*the 8

几乎没有关于这个问题的讨论,也没有提到如何引用"一行"(按数字,其中有一些值等),所以下面只是猜测你想要什么.

如果你不反对使用一个对象(可能是'太高级别',并且希望通过偏移量引用该行),则SplFileObject可以使用(从PHP 5.1.0开始提供).请参阅以下基本示例:

$file = new SplFileObject('myreallyhugefile.dat');
$file->seek(12345689); // seek to line 123456790
echo $file->current(); // or simply, echo $file
Run Code Online (Sandbox Code Playgroud)

该特定方法(seek)需要逐行扫描文件.但是,如果你说所有的线都是相同的长度,那么你可以用它fseek更快地到达你想去的地方.

$line_length = 1024; // each line is 1 KB line
$file->fseek($line_length * 1234567); // seek lots of bytes
echo $file->current(); // echo line 1234568
Run Code Online (Sandbox Code Playgroud)