PHP 从文件中读取第一行的最快捷的方法
回答 11
浏览 7.9万
2010-12-23
有什么最快、最简单的方法可以从一个文件中只读取第一行?我知道你可以使用file
,但在我的情况下,没有必要浪费时间来加载整个文件。
最好是一个单行本。
不知道这是否可行(只读取文件的第一行,而不加载任何"额外内容")。
- yoda 2010-12-23
也许是像
$buffer = '';while(strpos($buffer, "\n")===false){$buffer .= fread($handle, 16);} $string = substr($buffer, 0, strpos($buffer, "\n"));
这样的东西
- Jonah 2010-12-23
$line = (new SplFileObject($file))->fgets();
- 从 PHP 5.4.0 开始,可以使用花式构造和调用方法的语法。
- salathe 2013-03-26
11 个回答
#1楼
已采纳
得票数 145
好吧,你可以这样做。
$f = fopen($file, 'r');
$line = fgets($f);
fclose($f);
这不是一行,但如果你把它变成一行,你要么就会被错误检查搞砸,要么就会使资源开放的时间超过你所需要的时间,所以我说要保持多行。
编辑部
如果你ABSOLUTELY知道文件的存在,你可以使用一个单行代码。
$line = fgets(fopen($file, 'r'));
原因是,PHP为资源实现了RAII。
这意味着,当文件句柄超出范围时(在这种情况下,在调用fgets后立即发生),它将被关闭。
为了避免出现不需要的
\n
,你可能想在单行本中添加trim()
。
- Trendfischer 2016-07-27
#2楼
得票数 26
$firstline=`head -n1 filename.txt`;
linux ftw.我猜作为唯一的一个衬垫还不足以得到答案的投票......该死的微软!!!"。
- profitphp 2010-12-23
一句话可能就够了,但一个完全不适合新手的答案就不行了。代码可能很好,但如果有人需要这样的答案,他/她可能不了解PHP,就像他/她的靴子一样--我使用PHP已经10年了,但不知道你这一行是如何/为什么工作的,因此绝不会在我的代码中使用它。解释一下就好了。
- Kalko 2020-03-18
@ssi-anik 该死,我不知道。谢谢你的解释。我建议你把这个解释加到答案本身,这样更多的人就会明白。
- Kalko 2020-08-10
这种方法有两个问题:1/问题是关于最快速的方法,但回车操作意味着严重的开销。2/ 如果你使用"head"unix系统命令,你的代码将不能再被移植。
- ThatsMe 2021-12-02
#3楼
得票数 10
我印象深刻的是,没有人提到file()函数。
$line = file($filename)[0];
或者如果 version_compare(PHP_VERSION, "5.4.0") < 0:
$line = array_shift(file($filename));
"我知道你可以使用
file
,但在我的情况下,没有必要浪费时间加载整个文件。 :-)
- Jonah 2014-03-25
#4楼
得票数 8
$line = '';
$file = 'data.txt';
if($f = fopen($file, 'r')){
$line = fgets($f); // read until first newline
fclose($f);
}
echo $line;
#5楼
得票数 4
在现代的PHP中使用SplFileObject
。
$fileObject = new \SplFileObject('myfile');
$line = $fileObject->current();
补充性资料
使用SplFileObject
,也很容易寻找行数,例如跳过2行。
$fileObject = new \SplFileObject('myfile');
$fileObject->seek(2);
$line = $fileObject->current();
或阅读前10行。
$fileObject = new \SplFileObject('myfile');
$lines = '';
for ($i = 0; $i < 10 && $fileObject->valid(); ++$i) {
$lines .= $fileObject->getCurrentLine();
}
注意。getCurrentLine()
将读取当前行并将内部光标移至下一行(基本上是current()
+next()
)。
current()
和getCurrentLine()
之间有什么区别吗?
- matronator 2022-08-18
@matronator
getCurrentLine()
是fgets()
的别名;它'类似,但它会在内部将光标移动到下一行,本质上是current() + next()。我添加了一个注释。
- Fabien Sa 2022-08-19
#6楼
得票数 3
if(file_exists($file)) {
$line = fgets(fopen($file, 'r'));
}
#7楼
得票数 1
fgets()返回" ",这是最后的一个新行,但使用这段代码,你将得到第一行,而没有最后的换行。
$handle = @fopen($filePath, "r");
$text=fread($handle,filesize($filePath));
$lines=explode(PHP_EOL,$text);
$line = reset($lines);
#8楼
得票数 0
你可以尝试使用fread,并声明要读取的文件大小。
#9楼
得票数 0
在我的一个项目(qSandbox)中,我使用这种方法来获取一个文本文件的第一行,无论如何我都会阅读。 我的电子邮件模板是在一个文本文件中,主题在第一行。
$subj_regex = '#^\s*(.+)[\r\n]\s*#i';
// subject is the first line of the text file. Smart, eh?
if (preg_match($subj_regex, $buff, $matches)) {
$subject = $matches[1];
$buff = preg_replace($subj_regex, '', $buff); // rm subject from buff now.
}
#10楼
得票数 -1
如果你不介意在整个文件中阅读,那么一个单行本就可以了。
$first_line = array_shift(array_values(preg_split('/\r\n|\r|\n/', file_get_contents($file_path), 2)));
:)
叙述。在我的情况下,没有必要浪费时间去加载整个文件。
- YakovL 2018-10-17
#11楼
得票数 -8
尝试一下这个。
$file = 'data.txt';
$data = file_get_contents($file);
$lines = explode
你的答案是不完整的。
- chanchal118 2014-01-06