回答
可以使用fgets()
功能通过线来读取文件行:
$handle = fopen("inputfile.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
}
fclose($handle);
} else {
// error opening the file.
}
if ($file = fopen("file.txt", "r")) {
while(!feof($file)) {
$line = fgets($file);
# do same stuff with the $line
}
fclose($file);
}
由于@ Cuse70在他的回答中表示,如果文件不存在或无法打开,这将导致无限循环。在while循环之前测试'if($ file)' – FrancescoMM
我知道这是旧的,但是:不建议使用while(!feof($ file))。 [看看这里。](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) –
顺便说一句:“如果没有更多的数据要读取文件指针,那么返回FALSE。“ http://php.net/manual/en/function.fgets.php ...以防万一 – everyman
使用缓冲技术来读取文件。
$filename = "test.txt";
$source_file = fopen($filename, "r") or die("Couldn't open $filename");
while (!feof($source_file)) {
$buffer = fread($source_file, 4096); // use a buffer of 4KB
$buffer = str_replace($old,$new,$buffer);
///
}
这值得更多的爱,因为它将与巨大的文件,甚至没有回车或超长线条的文件... – Jimmery
我不会感到惊讶,如果OP没有真正关心实际线路,只是想例如提供下载。在这种情况下,这个答案就好了(而且大多数PHP编码器都会这样做)。 –
需小心,“而(!FEOF ...与fgets()”的东西,与fgets可以得到一个错误(returnfing假)和循环永远没有达到文件的末尾。codaddict是最接近于正确的但是当你的“而与fgets”循环结束时,检查FEOF;如果不是真的,那么你有一个错误
函数读取与阵列回报
function read_file($filename = ''){
$buffer = array();
$source_file = fopen($filename, "r") or die("Couldn't open $filename");
while (!feof($source_file)) {
$buffer[] = fread($source_file, 4096); // use a buffer of 4KB
}
return $buffer;
}
这会在内存中创建一个超过一个GB的单个数组(不失为一个好运),它甚至不是按行分割,而是以任意4096个字符块分割。你为什么要这么做? – FrancescoMM
您可以使用面向对象的接口类的文件 - SplFileObjecthttp://php.net/manual/en/splfileobject.fgets.php(PHP 5> = 5.1.0)
<?php
$file = new SplFileObject("file.txt");
// Loop until we reach the end of the file.
while (!$file->eof()) {
// Echo one line from the file.
echo $file->fgets();
}
// Unset the file to call __destruct(), closing the file handle.
$file = null;
有一个file()
函数,返回包含在文件中的线的阵列。
foreach(file('myfile.txt') as $line) {
echo $line. "\n";
}
一个GB文件将全部读入内存并转换为多个GB阵列......祝您好运。 – FrancescoMM
这不是所问问题的答案,但它确实回答了许多人在这里看到的更常见的问题,所以它仍然有用,谢谢。 – pilavdzice
file()对于处理小文件非常方便。特别是当你想要一个数组()作为最终结果时。 –
这个问题的一个流行的解决方案将有新的行字符的问题。用简单的str_replace
就可以很容易地修复它。
$handle = fopen("some_file.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
$line = str_replace("\n", "", $line);
}
fclose($handle);
}
foreach (new SplFileObject(__FILE__) as $line) {
echo $line;
}
爱上线 –
如果你打开一个大文件,你可能想使用旁边与fgets发电机(),以避免加载整个文件到内存:
/**
* @return Generator
*/
$fileData = function() {
$file = fopen(__DIR__ . '/file.txt', 'r');
if (!$file)
die('file does not exist or cannot be opened');
while (($line = fgets($file)) !== false) {
yield $line;
}
fclose($file);
};
使用方法如下:
foreach ($fileData() as $line) {
// $line contains current line
}
这样,您可以处理foreach()中的单个文件行。
注:发电机需要> = 5.5 PHP
这我如何与非常大的文件(具有高达100G测试)管理。并且它比fgets更快()
$block =1024*1024;//1MB or counld be any higher than HDD block_size*2
if($fh = fopen("file.txt", "r")){
$left='';
while (!feof($fh)) {// read the file
$temp = fread($fh, $block);
$fgetslines = explode("\n",$temp);
$fgetslines[0]=$left.$fgetslines[0];
if(!feof($fh))$left = array_pop($lines);
foreach($fgetslines as $k => $line){
//do smth with $line
}
}
}
fclose($fh);
SplFileObject在处理大文件时非常有用。
function parse_file($filename)
{
try {
$file = new SplFileObject($filename);
} catch (LogicException $exception) {
die('SplFileObject : '.$exception->getMessage());
}
while ($file->valid()) {
$line = $file->fgets();
//do something with $line
}
//don't forget to free the file handle.
$file = null;
}
- 1. Java - 如何逐字读取大文件而不是逐行读取?
- 2. 如何逐行阅读大文件?
- 3. 如何逐行读取文本文件?
- 4. 如何逐行读取文本文件?
- 5. 在PHP中逐行读取大文件
- 6. 在Rust中逐行读取大文件
- 7. nodejs同步逐行读取大文件?
- 8. Android逐行读取大文件
- 9. 用ADO Stream逐行读取大文件?
- 10. 大文件逐行阅读
- 11. 如何获取文件逐行阅读
- 12. 如何逐行读取gzip文件?
- 13. 逐行读取文件
- 14. 逐行读取文件
- 15. 逐行读取.json文件
- 16. C++逐行读取文件
- 17. 逐行读取文件
- 18. 逐行读取csv文件
- 19. 逐行读取文件,逐字符C
- 20. 如何逐行读取uitextview文本行?
- 21. 如何在读取大文件(Perl)后使用SCALAR逐行读取?
- 22. 如何从txt文件中逐字符读取字符并逐行读取C++
- 23. 读取大文件和处理逐节
- 24. 如何逐行读取大型文本文件并将此流添加到Ruby中的逐行文件中?
- 25. 如何逐行读取
- 26. 如何通过逐行读取文件来获取上一行
- 27. 从文件行逐行读取
- 28. 逐行读取文件和标记行
- 29. 逐行向后读取文件行
- 30. 用PHP逐行阅读大文件?
看到我的答案来源与这个[链接](http://stackoverflow.com/questions/13231547/export-simple-excel-data-into-mysql-using-php/13231633#13231633) –
你应该使用不带'$ length'参数的'fgets()'。 – Carlos
您想标记为以下任一答案吗? –