web-dev-qa-db-fra.com

Moyen le plus rapide de lire la première ligne d'un fichier

Quel est le moyen le plus rapide et le plus simple de lire la première ligne uniquement à partir d'un fichier? Je sais que vous pouvez utiliser file, mais dans mon cas, il ne sert à rien de perdre du temps à charger tout le fichier.

De préférence un one-liner.

45
Jonah

Eh bien, vous pourriez faire:

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

Ce n'est pas une ligne, mais si vous la définissiez en une ligne, vous seriez foutu pour la vérification des erreurs ou vous laisseriez des ressources ouvertes plus longtemps que nécessaire, alors je dirais de garder les lignes

Modifier

Si vous FAITES _ ABSOLUMENT savoir que le fichier existe, vous pouvez utiliser une ligne unique:

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

La raison en est que PHP implémente RAII pour les ressources. 

Cela signifie que lorsque le descripteur de fichier sort du cadre (ce qui se produit immédiatement après l'appel de fgets dans ce cas), il sera fermé. 

116
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

Je suis impressionné que personne n'ait mentionné la fonction file ():

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

ou si 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
Mateusz Bacławski

Vous pouvez essayer de nous fread et déclarer la taille du fichier à lire. 

0
ngen

Dans l'un de mes projets (qSandbox), j'utilise cette approche pour obtenir la première ligne d'un fichier texte que je lis quand même ..__ J'ai mes modèles de courrier électronique dans un fichier texte et le sujet dans la première ligne.

$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
Svetoslav Marinov