PHP:从文件中读取特定行

时间:2011-04-25 05:22:33

标签: php file line

我正在尝试使用php从文本文件中读取特定行。 这是文本文件:

foo  
foo2

如何使用php获取第二行的内容? 这将返回第一行:

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

..但我需要第二个。

非常感谢任何帮助

13 个答案:

答案 0 :(得分:80)

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

file — Reads entire file into an array

答案 1 :(得分:29)

omg 我缺少7个代表来发表评论。这是@ Raptor&amp; amp; @ Tomm的评论,因为这个问题在google serps中仍然显示出很高的位置。

他是完全正确的。对于小文件file($file);完全没问题。对于大型文件,它的总体过度使用b / c php数组会像疯了一样吃掉内存。

我刚刚用* .csv进行了一次小测试,文件大小约为67mb(1,000,000行):

$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桌面上,因此它不具备生产环境的代表性,但仍然......相当不同。

答案 2 :(得分:16)

如果你想这样做......

$line = 0;

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

或者,使用file()打开它,并使用[1]下划线。

答案 3 :(得分:11)

我会使用SplFileObject类......

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

答案 4 :(得分:8)

您可以使用以下内容获取文件中的所有行

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

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


print_r($lines);
你的第二行是

$lines[1]

答案 5 :(得分:6)

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

答案 6 :(得分:3)

如果您在Linux上使用PHP,您可以尝试以下方法来阅读第74行和第159行之间的文本:

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

如果你的文件很大,这个解决方案很好。

答案 7 :(得分:2)

您必须将文件循环到文件末尾。

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

您可以尝试循环直到所需的行,而不是EOF,并且每次都将变量重置为行(不添加到行)。在您的情况下,第二行是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;
?>

答案 10 :(得分:1)

我喜欢daggett answer,但如果您的文件不够大,还可以尝试其他解决方案。

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

答案 11 :(得分:1)

这个问题现在已经很老了,但对于任何处理非常大的文件的人来说,这里的解决方案不涉及读取每一行。对于一个包含大约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个字符,然后从该数据中抓取第一个完整的行。

答案 12 :(得分:0)

我搜索了一种单行解决方案来从文件中读取特定行。 这是我的解决方案:

echo file('dayInt.txt')[1]