파일을 한 줄씩 읽고 싶지만 메모리에 완전히로드하지 않습니다.
내 파일이 너무 커서 메모리에서 열 수 없으며 그렇게하면 항상 메모리 부족 오류가 발생합니다.
파일 크기는 1GB입니다.
fgets()
없이 사용해야합니다 $length
.
파일을 한 줄씩 읽고 싶지만 메모리에 완전히로드하지 않습니다.
내 파일이 너무 커서 메모리에서 열 수 없으며 그렇게하면 항상 메모리 부족 오류가 발생합니다.
파일 크기는 1GB입니다.
fgets()
없이 사용해야합니다 $length
.
답변:
이 fgets()
함수를 사용하여 파일을 한 줄씩 읽을 수 있습니다 .
$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
부분을 어떻게 설명합니까?
if ($file = fopen("file.txt", "r")) {
while(!feof($file)) {
$line = fgets($file);
# do same stuff with the $line
}
fclose($file);
}
if($file)
while 루프 전 테스트
feof()
더 이상 존재하지 않습니까?
파일에 객체 지향 인터페이스 클래스를 사용할 수 있습니다 -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()
있는 한 SplFileObject 에는 함수 가 없습니다 .
rtrim($file->fgets())
원하지 않는 경우 읽은 각 행 문자열에 대해 후행 줄 바꿈을 제거하십시오.
큰 파일을 열 경우 fgets ()와 함께 Generators를 사용하여 전체 파일을 메모리에로드하지 않도록 할 수 있습니다.
/**
* @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 () 내에서 개별 파일 라인을 처리 할 수 있습니다.
참고 : 생성기는 PHP 5.5 이상이어야합니다.
SplFileObject
접근 방식 과 비교할 때.
버퍼링 기술을 사용하여 파일을 읽습니다.
$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);
///
}
이 file()
파일에 포함 된 라인의 배열을 반환 기능.
foreach(file('myfile.txt') as $line) {
echo $line. "\n";
}
foreach (new SplFileObject(__FILE__) as $line) {
echo $line;
}
file()
입니다.
명백한 대답은 모든 대답에 없었습니다.
PHP에는 그 목적을 위해 깔끔한 스트리밍 구분 기호 파서가 있습니다.
$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)
이렇게하면 매우 큰 파일로 관리하는 방법 (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;
}
<?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++;
}
?>
배열 반환으로 읽을 함수
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;
}