web-dev-qa-db-fra.com

PHP: Lire une ligne spécifique à partir d'un fichier

J'essaie de lire une ligne spécifique d'un fichier texte en utilisant php . Voici le fichier texte: 

foo  
foo2

Comment pourrais-je obtenir le contenu de la deuxième ligne en utilisant php? Cela renvoie la première ligne:

<?php 
$myFile = "4-24-11.txt";
$fh = fopen($myFile, 'r');
$theData = fgets($fh);
fclose($fh);
echo $theData;
?>

..mais j'ai besoin de la seconde. 

Toute aide serait grandement appréciée 

45
Sang Froid
$myFile = "4-24-11.txt";
$lines = file($myFile);//file in to an array
echo $lines[1]; //line 2

file - Lit le fichier entier dans un tableau

74
user557846

omg Il me manque 7 rep pour faire des commentaires. Ceci est le commentaire de @ Raptor & @ Tomm, puisque cette question est toujours très présente dans google serps.

Il a raison. file($file); convient parfaitement pour les petits fichiers. Pour les gros fichiers, c’est la surexploitation totale des tableaux bp c/php qui consomment la mémoire comme un fou.

Je viens de lancer un petit test avec un * .csv avec une taille de fichier d'environ 67 Mo (1 000 000 lignes):

$t = -microtime(1);
$file = '../data/1000k.csv';
$lines = file($file);
echo $lines[999999]
    ."\n".(memory_get_peak_usage(1)/1024/1024)
    ."\n".($t+microtime(1));
//227.5
//0.22701287269592
//Process finished with exit code 0

Et comme personne ne l’a encore dit, j’ai essayé la SplFileObject, que je viens de découvrir récemment.

$t = -microtime(1);
$file = '../data/1000k.csv';
$spl = new SplFileObject($file);
$spl->seek(999999);
echo $spl->current()
    ."\n".(memory_get_peak_usage(1)/1024/1024)
    ."\n".($t+microtime(1));
//0.5
//0.11500692367554
//Process finished with exit code 0

C'était sur mon ordinateur Win7, donc ce n'est pas représentatif de l'environnement de production, mais quand même ... c'est toute la différence.

26
nimmneun

Si vous vouliez le faire de cette façon ...

$line = 0;

while (($buffer = fgets($fh)) !== FALSE) {
   if ($line == 1) {
       // This is the second line.
       break;
   }   
   $line++;
}

Sinon, ouvrez-le avec file() et inscrivez la ligne avec [1].

15
alex

Je voudrais utiliser la classe SplFileObject ...

$file = new SplFileObject("filename");
if (!$file->eof()) {
     $file->seek($lineNumber);
     $contents = $file->current(); // $contents would hold the data from line x
}
8
Phil

vous pouvez utiliser ce qui suit pour obtenir toutes les lignes du fichier

$handle = @fopen('test.txt', "r");

if ($handle) { 
   while (!feof($handle)) { 
       $lines[] = fgets($handle, 4096); 
   } 
   fclose($handle); 
} 


print_r($lines);

et $lines[1] pour votre deuxième ligne

7
balanv
$myFile = "4-21-11.txt";
$fh = fopen($myFile, 'r');
while(!feof($fh))
{
    $data[] = fgets($fh);  
    //Do whatever you want with the data in here
    //This feeds the file into an array line by line
}
fclose($fh);
5
Phoenix

Si vous utilisez PHP sous Linux, essayez ce qui suit pour lire du texte, par exemple entre les lignes 74 et 159:

$text = Shell_exec("sed -n '74,159p' path/to/file.log");

Cette solution est bonne si votre fichier est volumineux.

2
mineroot

Vous devez boucler le fichier jusqu'à la fin du fichier. 

  while(!feof($file))
  {
     echo fgets($file). "<br />";
  }
  fclose($file);
1
Rikesh

Vous pouvez essayer de boucler jusqu'à la ligne souhaitée, et non pas l'EOF, et de réinitialiser la variable sur la ligne à chaque fois (sans l'ajouter). Dans votre cas, la deuxième ligne est le fin de fichier. (Une boucle for est probablement plus appropriée dans mon code ci-dessous).

De cette façon, le fichier entier n'est pas dans la mémoire; L'inconvénient est qu'il faut du temps pour parcourir le fichier jusqu'au point souhaité.

<?php 
$myFile = "4-24-11.txt";
$fh = fopen($myFile, 'r');
$i = 0;
while ($i < 2)
 {
  $theData = fgets($fh);
  $i++
 }
fclose($fh);
echo $theData;
?>
0
Devin Camenares

Utilisez stream_get_line: stream_get_line - Extrait une ligne d'une ressource de flux jusqu'à un délimiteur donné Source: http://php.net/manual/en/function.stream-get-line.php

0
Sunit

Cette question est assez ancienne à présent, mais pour ceux qui traitent de très gros fichiers, voici une solution qui n’implique pas la lecture de chaque ligne précédente. C’est aussi la seule solution qui a fonctionné dans mon cas pour un fichier contenant environ 160 millions de lignes.

<?php
function Rand_line($fileName) {
    do{
        $fileSize=filesize($fileName);
        $fp = fopen($fileName, 'r');
        fseek($fp, Rand(0, $fileSize));
        $data = fread($fp, 4096);  // assumes lines are < 4096 characters
        fclose($fp);
        $a = explode("\n",$data);
    }while(count($a)<2);
    return $a[1];
}

echo Rand_line("file.txt");  // change file name
?>

Cela fonctionne en ouvrant le fichier sans rien lire, puis en déplaçant le pointeur instantanément vers une position aléatoire, en lisant jusqu'à 4096 caractères à partir de ce point, puis en saisissant la première ligne complète à partir de ces données.

0
cantelope

J'aime daggett répond mais il existe une autre solution que vous pouvez essayer si votre fichier n’est pas assez gros.

$file = __FILE__; // Let's take the current file just as an example.

$start_line = __LINE__ -1; // The same with the line what we look for. Take the line number where $line variable is declared as the start.

$lines_to_display = 5; // The number of lines to display. Displays only the $start_line if set to 1. If $lines_to_display argument is omitted displays all lines starting from the $start_line.

echo implode('', array_slice(file($file), $start_line, lines_to_display));
0
drugan