webentwicklung-frage-antwort-db.com.de

PHP: Spezifische Zeile aus Datei lesen

Ich versuche, eine bestimmte Zeile aus einer Textdatei mit php ..__ zu lesen. Hier ist die Textdatei: 

foo  
foo2

Wie bekomme ich den Inhalt der zweiten Zeile mit PHP? Dies gibt die erste Zeile zurück:

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

..aber ich brauche den zweiten. 

Jede Hilfe wäre sehr dankbar 

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

Datei - Liest die gesamte Datei in ein Array

74
user557846

omg Mir fehlen 7 Wiederholungen, um Kommentare zu machen. Dies ist @ Raptors & @ Tomms Kommentar, da diese Frage bei Google-Serben immer noch sehr hoch ist.

Er ist genau richtig. Für kleine Dateien ist file($file); vollkommen in Ordnung. Für große Dateien ist es völlig übertrieben b/c php-Arrays, die wie verrücktes Gedächtnis essen.

Ich habe gerade einen winzigen Test mit einer * .csv mit einer Dateigröße von ~ 67mb (1.000.000 Zeilen) durchgeführt:

$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

Und da es noch niemand erwähnt hat, habe ich das SplFileObject probiert, was ich gerade für mich selbst entdeckt habe.

$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

Dies war auf meinem Win7-Desktop, also nicht repräsentativ für die Produktionsumgebung, aber trotzdem ... der Unterschied.

26
nimmneun

Wenn du es so machen wolltest ...

$line = 0;

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

Alternativ können Sie es mit file() öffnen und die Zeile mit [1] unterzeichnen.

15
alex

Ich würde die SplFileObject-Klasse verwenden ...

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

sie können Folgendes verwenden, um alle Zeilen in der Datei abzurufen

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

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


print_r($lines);

und $lines[1] für Ihre zweite Zeile

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

Wenn Sie PHP unter Linux verwenden, können Sie versuchen, Text zwischen 74. und 159. Zeile zu lesen:

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

Diese Lösung ist gut, wenn Ihre Datei groß ist.

2
mineroot

Sie müssen die Datei bis zum Ende der Datei durchlaufen. 

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

Sie können versuchen, bis zur gewünschten Zeile zu schleifen, nicht zur EOF, und die Variable jedes Mal auf die Zeile zurückzusetzen (nicht dazu hinzuzufügen). In Ihrem Fall ist die 2. Zeile die EOF. (Eine for-Schleife ist in meinem folgenden Code wahrscheinlich besser geeignet).

Auf diese Weise befindet sich die gesamte Datei nicht im Speicher. Der Nachteil ist, dass es Zeit braucht, um die Datei bis zu dem gewünschten Punkt durchzugehen.

<?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

Verwenden Sie stream_get_line: stream_get_line - Ruft eine Zeile von der Stream-Ressource bis zu einem bestimmten Trennzeichen ab Quelle: http://php.net/manual/de/function.stream-get-line.php

0
Sunit

Diese Frage ist mittlerweile ziemlich alt, aber für alle, die mit sehr großen Dateien zu tun haben, gibt es hier eine Lösung, bei der nicht alle vorhergehenden Zeilen gelesen werden. Dies war auch die einzige Lösung, die in meinem Fall für eine Datei mit ~ 160 Millionen Zeilen funktionierte.

<?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
?>

Es öffnet die Datei, ohne etwas zu lesen, bewegt den Zeiger sofort in eine zufällige Position, liest bis zu 4096 Zeichen von diesem Punkt aus und holt dann die erste vollständige Zeile aus diesen Daten.

0
cantelope

Ich mag daggett answer , aber es gibt eine andere Lösung, die Sie ausprobieren können, wenn Ihre Datei nicht groß genug ist.

$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