2016-04-22 9 views
0

Wir haben eine 8 GB-Datei, jede Zeile ist eine Ausgabe, so dass es Binärdaten enthalten kann. Aber ich habe bemerkt, dass Daten das 0x0A Byte nicht enthalten und dieses Byte wird verwendet, um Zeilen in einer Datei zu trennen.Wie liest man eine Datei Zeile für Zeile in PHP, wenn Zeilen mit 0x0A getrennt sind?

Die Funktion fgets() hilft nicht, da es am Ende der Leitung auf beide 0x0A oder 0x0D Bytes erkennt, sieht so fgets() mehr als Zeilenseparatoren existiert.

Gibt es eine fgets() Version, die nur das 0x0A Byte als Zeilentrennzeichen für meinen Fall verwendet?

Gibt es einen anderen Ansatz, ohne meine eigene Lese-Puffer-Parsing-Linien-emittierende Lösung zu codieren?

P. S.file_get_contents() nicht wie Dateien größer als 2 GB.

+0

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

+1

Sie können fgets() verwenden, für das letzte Zeichen testen und Linien zusammennähen, wenn es ein 0x0D –

+0

ist, erkennt PHP normalerweise \ n oder \ r \ n als Linienendungen. Einfache Zeilenumbrüche werden nur als Zeilenenden erkannt, wenn auto_detect_line_endings auf "true" gesetzt ist (false ist der Standardwert). Was sagt Ihre Einstellung auto_detect_line_endings? – Jojo

Antwort

1

Lösung

Meine aktuelle Lösung auf Kommentar anzeigen Jonid Bendo basiert: stream_get_line() (http://php.net/manual/en/function.stream-get-line.php), sondern auf Meine Plattform, stream_get_line() gibt keine Zeilen länger als 8192 Bytes zurück, also verwende ich eine Schleife um sie zu erkennen das und rekonstruiere längere Strings:

$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); 
Verwandte Themen