Tôi muốn đọc từng dòng tệp, nhưng không tải hoàn toàn vào bộ nhớ.
Tệp của tôi quá lớn để mở trong bộ nhớ và nếu cố gắng làm như vậy tôi luôn thoát khỏi lỗi bộ nhớ.
Kích thước tệp là 1 GB.
fgets()
mà không cần $length
tham số.
Tôi muốn đọc từng dòng tệp, nhưng không tải hoàn toàn vào bộ nhớ.
Tệp của tôi quá lớn để mở trong bộ nhớ và nếu cố gắng làm như vậy tôi luôn thoát khỏi lỗi bộ nhớ.
Kích thước tệp là 1 GB.
fgets()
mà không cần $length
tham số.
Câu trả lời:
Bạn có thể sử dụng fgets()
chức năng để đọc từng dòng tệp:
$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 memory
một phần?
if ($file = fopen("file.txt", "r")) {
while(!feof($file)) {
$line = fgets($file);
# do same stuff with the $line
}
fclose($file);
}
if($file)
trước vòng lặp while
feof()
không tồn tại nữa?
Bạn có thể sử dụng một lớp giao diện hướng đối tượng cho một tệp - 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()
chức năng nào trong SplFileObject?
rtrim($file->fgets())
để tách các dòng mới theo dõi cho từng chuỗi dòng được đọc nếu bạn không muốn chúng.
Nếu bạn đang mở một tệp lớn, có lẽ bạn muốn sử dụng Trình tạo cùng với fgets () để tránh tải toàn bộ tệp vào bộ nhớ:
/**
* @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);
};
Sử dụng nó như thế này:
foreach ($fileData() as $line) {
// $line contains current line
}
Bằng cách này, bạn có thể xử lý các dòng tệp riêng lẻ bên trong foreach ().
Lưu ý: Trình tạo yêu cầu> = PHP 5.5
SplFileObject
cách tiếp cận.
Sử dụng các kỹ thuật đệm để đọc tệp.
$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);
///
}
Có một file()
hàm trả về một mảng các dòng có trong tệp.
foreach(file('myfile.txt') as $line) {
echo $line. "\n";
}
foreach (new SplFileObject(__FILE__) as $line) {
echo $line;
}
file()
.
Câu trả lời rõ ràng không có trong tất cả các câu trả lời.
PHP có một trình phân tích cú pháp phân tách trực tuyến gọn gàng có sẵn cho chính xác mục đích đó.
$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)
Đây là cách tôi quản lý với tệp rất lớn (được thử nghiệm với tối đa 100G). Và nó nhanh hơn 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);
Một trong những giải pháp phổ biến cho câu hỏi này sẽ có vấn đề với nhân vật dòng mới. Nó có thể được sửa chữa khá dễ dàng với một đơn giản str_replace
.
$handle = fopen("some_file.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
$line = str_replace("\n", "", $line);
}
fclose($handle);
}
SplFileObject rất hữu ích khi xử lý các tệp lớn.
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++;
}
?>
Chức năng đọc với trả về mảng
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;
}