web-dev-qa-db-de.com

Der schnellste Weg, die erste Zeile aus der Datei zu lesen

Was ist der schnellste und einfachste Weg, die erste Zeile nur aus einer Datei zu lesen? Ich weiß, dass Sie file verwenden können, aber in meinem Fall ist es sinnlos, die Zeit zu verlieren, die gesamte Datei zu laden.

Vorzugsweise eine Einlage.

45
Jonah

Nun, du könntest tun:

$f = fopen($file, 'r');
$line = fgets($f);
fclose($f);

Es ist keine einzige Zeile, aber wenn Sie eine Zeile erstellt haben, werden Sie entweder zur Fehlerprüfung geschraubt oder lassen Ressourcen länger offen, als Sie sie benötigen. Daher würde ich sagen, dass Sie die mehreren Zeilen beibehalten

Bearbeiten

Wenn Sie ABSOLUT wissen, dass die Datei existiert, können Sie einen Einzeiler verwenden:

$line = fgets(fopen($file, 'r'));

Der Grund ist, dass PHP RAII für Ressourcen implementiert.

Das heißt, wenn das Dateihandle den Gültigkeitsbereich verlässt (was in diesem Fall unmittelbar nach dem Aufruf von fgets geschieht), wird es geschlossen.

122
ircmaxell
$firstline=`head -n1 filename.txt`;
27
profitphp
$line = '';
$file = 'data.txt';
if($f = fopen($file, 'r')){
  $line = fgets($f); // read until first newline
  fclose($f);
}
echo $line;
6
Sarah

Ich bin beeindruckt, dass niemand die file () - Funktion erwähnt hat:

$line = file($filename)[0];

oder wenn version_compare (PHP_VERSION, "5.4.0") <0:

$line = array_shift(file($filename));
6
Tarjei Huse
if(file_exists($file)) {
    $line = fgets(fopen($file, 'r'));
}
2

Sie könnten versuchen, uns fread zuzuweisen und die Dateigröße zum Lesen zu erklären. 

0
ngen

In einem meiner Projekte (qSandbox) verwende ich diesen Ansatz, um die erste Zeile einer Textdatei abzurufen, die ich sowieso gelesen habe .. Ich habe meine E-Mail-Vorlagen in einer Textdatei und der Betreff steht in der ersten Zeile.

$subj_regex = '#^\s*(.+)[\r\n]\s*#i';

// subject is the first line of the text file. Smart, eh?
if (preg_match($subj_regex, $buff, $matches)) {
    $subject = $matches[1];
    $buff = preg_replace($subj_regex, '', $buff); // rm subject from buff now.
}
0