如果用0x0A分隔行,如何在PHP中逐行读取文件?

时间:2016-04-22 14:41:23

标签: php parsing fgets

我们有一个8 GB的文件,每行是serialize()输出,因此它可以包含二进制数据。但我注意到数据不包含0x0A字节,该字节用于分隔文件中的行。

函数fgets()没有帮助,因为它检测到0x0A0x0D个字节的行尾,因此fgets()会看到更多的行分隔符比存在。

是否有fgets()版本仅使用0x0A字节作为我的案例的行分隔符?

是否有另一种方法没有编写我自己的读缓冲解析线发射解决方案?

P.S。 file_get_contents()不喜欢大于2GB的文件。

2 个答案:

答案 0 :(得分:2)

您可以尝试:

string stream_get_line ( resource $handle , int $length [, string $ending ] );
//i.e.
string stream_get_line ($handle , filesize($myFile) , '\n' );

参考:http://php.net/manual/en/function.stream-get-line.php

答案 1 :(得分:1)

<强>解决方案

我目前的解决方案基于用户Jonid Bendo的评论: stream_get_line()http://php.net/manual/en/function.stream-get-line.php),但在我的平台上,stream_get_line()不会返回超过8192个字节的行,因此我使用它周围的循环来检测并重建更长的字符串:

$master = "";
do
{
    $line = stream_get_line ($handle, 1024*128, "\n");
    $ll = strlen($line);
    if ($ll < 1) {
        break;
    }

    $badline = ($ll == 8192) && ('\n' != $line[$ll-1]);

    $master .= $line;

} while( $badline );