2016-04-22 99 views
0

我們有一個8 GB的文件,每行是一個serialize()輸出,所以它可以包含二進制數據。但我注意到數據不包含0x0A字節,該字節用於分隔文件中的行。如何在PHP中使用0x0A分隔行來逐行讀取文件?

功能fgets()沒有幫助,因爲它檢測到結束行兩0x0A0x0D字節,所以fgets()多見行分隔比存在。

是否有fgets()版本只使用0x0A字節作爲我的情況的行分隔符?

有沒有編碼我自己的讀緩衝分析線發射解決方案的另一種方法?

P.S.file_get_contents()不像大於2GB的文件。

+0

'$ temp = file_get_contents('foo.txt'); $ lines = preg_split('/ [\ x0a \ x0d] + /',$ temp);'? –

+1

您可以使用fgets(),測試最後一個字符,如果它是0x0D –

+0

,則將線拼接在一起,php會檢測\ n或\ r \ n作爲行尾。僅當auto_detect_line_endings設置爲true(false爲默認值)時,纔會將簡單的回車符檢測爲行尾。什麼是你的auto_detect_line_endings設置說的? – Jojo

回答

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