PHP:从文件读取特定行

我试图从一个文本文件使用PHP读取特定的行。 这是文本文件:

foo foo2 

我将如何获得第二行使用PHP的内容? 这返回第一行:

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

但是我需要第二个。

任何帮助将不胜感激

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

文件 – 将整个文件读取到一个数组中

如果你想这样做…

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

或者,用file()打开它,用[1]下标。

omg我缺乏7个代表发表评论。 这是@猛禽的&@ Tomm的评论,因为这个问题仍然显示在谷歌serps高的方式。

他完全正确。 对于小文件file($file); 是完美的。 对于大型文件,这是总的矫枉过正b / c phparrays吃疯了似的记忆。

我只用一个* .csv文件大小为〜67mb(1000000行)的小testing:

 $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 

而且由于没有人提到它,我给了SplFileObject一个尝试,我实际上刚刚发现了我自己。

 $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 

这是在我的Win7桌面上,所以它不具有代表性的生产环境,但仍然…相当不同。

您可以使用以下命令获取文件中的所有行

 $handle = @fopen('test.txt', "r"); if ($handle) { while (!feof($handle)) { $lines[] = fgets($handle, 4096); } fclose($handle); } print_r($lines); 

$lines[1]为你的第二行

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

我会使用SplFileObject类…

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

如果您在Linux上使用PHP,您可以尝试以下操作来读取第74行到第159行之间的文本:

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

如果你的文件很大,这个解决scheme是很好的。

您必须循环文件直到文件结束。

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

使用stream_get_line:stream_get_line – 从stream资源获取行到给定的分隔符来源: http : //php.net/manual/en/function.stream-get-line.php

你可以尝试循环,直到你想要的行,而不是EOF,并重新设置variables到每一行(不添加到它)。 在你的情况下,第二行是EOF。 (for循环可能更适合我的代码)。

这样整个文件不在内存中; 缺点是需要花费时间浏览文件,直到您想要的位置。

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

我喜欢daggett的答案,但有另一种解决scheme,你可以尝试如果你的文件不够大。

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

这个问题现在已经很老了,但是对于处理大文件的人来说,这里是一个解决scheme,不涉及每一行前面的内容。 这也是唯一的解决scheme,在我的情况下工作约1.6亿行文件。

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

它通过打开文件而不读取任何内容,然后将指针立即移动到随机位置,从该点读取多达4096个字符,然后从该数据中抓取第一个完整行。