Saya ingin membaca file baris demi baris, tetapi tanpa memuatnya dalam memori.
File saya terlalu besar untuk dibuka di memori, dan jika coba lakukan saya selalu keluar dari kesalahan memori.
Ukuran file adalah 1 GB.
fgets()tanpa $lengthparameter.
Saya ingin membaca file baris demi baris, tetapi tanpa memuatnya dalam memori.
File saya terlalu besar untuk dibuka di memori, dan jika coba lakukan saya selalu keluar dari kesalahan memori.
Ukuran file adalah 1 GB.
fgets()tanpa $lengthparameter.
Jawaban:
Anda dapat menggunakan fgets()fungsi ini untuk membaca file baris demi baris:
$handle = fopen("inputfile.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
}
fclose($handle);
} else {
// error opening the file.
}
too large to open in memorybagian itu?
if ($file = fopen("file.txt", "r")) {
while(!feof($file)) {
$line = fgets($file);
# do same stuff with the $line
}
fclose($file);
}
if($file)sebelum loop sementara
feof()tidak ada lagi?
Anda dapat menggunakan kelas antarmuka berorientasi objek untuk file - SplFileObject http://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;
eof()fungsi di SplFileObject?
rtrim($file->fgets())untuk menelusur baris baru untuk setiap string baris yang dibaca jika Anda tidak menginginkannya.
Jika Anda membuka file besar, Anda mungkin ingin menggunakan Generator di samping fgets () untuk menghindari memuat seluruh file ke dalam memori:
/**
* @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);
};
Gunakan seperti ini:
foreach ($fileData() as $line) {
// $line contains current line
}
Dengan cara ini Anda dapat memproses masing-masing baris file di dalam foreach ().
Catatan: Generator membutuhkan> = PHP 5.5
SplFileObjectpendekatan.
Gunakan teknik buffering untuk membaca file.
$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);
///
}
Ada file()fungsi yang mengembalikan array dari baris yang ada di file.
foreach(file('myfile.txt') as $line) {
echo $line. "\n";
}
foreach (new SplFileObject(__FILE__) as $line) {
echo $line;
}
file().
Jawaban yang jelas tidak ada di semua tanggapan.
PHP memiliki parser pembatas streaming yang rapi tersedia untuk tujuan itu.
$fp = fopen("/path/to/the/file", "r+");
while ($line = stream_get_line($fp, 1024 * 1024, "\n")) {
echo $line;
}
fclose($fp);
while (($line = stream_get_line($fp, 1024 * 1024, "\n")) !== false)
Ini cara saya mengelola dengan file yang sangat besar (diuji hingga 100G). Dan ini lebih cepat dari pada 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);
Salah satu solusi populer untuk pertanyaan ini akan memiliki masalah dengan karakter baris baru. Ini bisa diperbaiki dengan mudah dengan sederhana str_replace.
$handle = fopen("some_file.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
$line = str_replace("\n", "", $line);
}
fclose($handle);
}
SplFileObject berguna ketika berurusan dengan file besar.
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;
}
<?php
echo '<meta charset="utf-8">';
$k= 1;
$f= 1;
$fp = fopen("texttranslate.txt", "r");
while(!feof($fp)) {
$contents = '';
for($i=1;$i<=1500;$i++){
echo $k.' -- '. fgets($fp) .'<br>';$k++;
$contents .= fgets($fp);
}
echo '<hr>';
file_put_contents('Split/new_file_'.$f.'.txt', $contents);$f++;
}
?>
Berfungsi untuk Membaca dengan pengembalian array
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;
}