我正在尝试使用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
file -将整个文件读入数组
omg我缺少7个代表来发表评论。这是@猛龙的&@Tomm的评论,因为这个问题在谷歌搜索中仍然显示得很高。
他完全正确。对于小文件,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桌面,所以它不代表生产环境,但仍然…差别很大
如果你想那样做…
$line = 0;
while (($buffer = fgets($fh)) !== FALSE) {
if ($line == 1) {
// This is the second line.
break;
}
$line++;
}
也可以用file()
打开,然后用[1]
下标。
我将使用SplFileObject类…
$file = new SplFileObject("filename");
if (!$file->eof()) {
$file->seek($lineNumber);
$contents = $file->current(); // $contents would hold the data from line x
}
您可以使用以下命令获取文件
中的所有行$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);
这个问题现在已经很老了,但是对于任何处理非常大的文件的人来说,这里有一个解决方案,不需要阅读前面的每一行。在我的例子中,这也是唯一有效的解决方案,因为文件有~ 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个字符,然后从该数据中抓取第一行。
如果您在Linux上使用PHP,您可以尝试以下操作来读取第74行到第159行之间的文本:
$text = shell_exec("sed -n '74,159p' path/to/file.log");
你必须循环文件直到文件结束。
while(!feof($file))
{
echo fgets($file). "<br />";
}
fclose($file);
我喜欢daggett答案,但如果你的文件不够大,你可以尝试另一种解决方案。
$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));
使用stream_get_line: stream_get_line -获取从流资源到给定分隔符的行来源:http://php.net/manual/en/function.stream-get-line.php
您可以尝试循环到您想要的行,而不是EOF,并每次将变量重置为该行(而不是添加到该行)。在您的示例中,第2行是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;
?>