我想逐行读取文件,但不完全加载到内存中。
我的文件太大了,无法在内存中打开,如果尝试这样做,我总是会得到内存溢出错误。
文件大小为1gb。
我想逐行读取文件,但不完全加载到内存中。
我的文件太大了,无法在内存中打开,如果尝试这样做,我总是会得到内存溢出错误。
文件大小为1gb。
当前回答
小心使用'while(!feof……Fgets()的东西,Fgets可以得到一个错误(返回false)和永远循环而不到达文件的结束。Codaddict是最接近正确的,但当你的'while 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;
}
这就是我如何处理非常大的文件(测试高达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);
小心使用'while(!feof……Fgets()的东西,Fgets可以得到一个错误(返回false)和永远循环而不到达文件的结束。Codaddict是最接近正确的,但当你的'while fgets'循环结束时,检查feof;如果不是真的,那么你就出错了。
使用缓冲技术读取文件。
$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);
///
}
你可以使用fgets()函数逐行读取文件:
$handle = fopen("inputfile.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
}
fclose($handle);
}