2012-10-10 2 views
0

큰 파일에서 특정 줄을 제거하는 것이 가장 빠른 방법 인 경우 궁금합니다 (존재하는 경우).가장 빠른 방법으로 검색/파일에서 행 추가/제거

그래서 예를 들어 나는

yxz 
srtabc 
efg 

은 또한, 나는이에 줄을 추가하려는되고

abc 

파일

yxz 
srtabc 
abc 
efg 

에서 제거 할 다음 행을 원하는 파일 (존재하지 않는 경우).

파일 순서는 중요하지 않으며 검색 성능이 향상되면 정렬 할 수 있습니다.

퍼포먼스가 내 강점이 아니므로 여기로 내려 가기위한 최상의 경로를 결정하는 데 약간의 문제가 있습니다.

+0

을 솔루션은 프로그래밍 방식으로해야합니까? – alfasin

답변

0

file_put_contents 또는 file_get_contents을 사용하면 파일의 모든 내용을 한 번에 PHP로로드하므로 큰 파일을 사용하는 경우이 기능을 사용할 수 없으므로 조언을 제공하지 않습니다.

두 파일로 작업 할 수 있고 다른 파일을 한 줄씩 읽어 들일 수 있습니다 ..... 대체 할 내용을 바꿉니다. 끝에 이름을 바꿉니다. 매우 큰 파일로 작업 할 때만 효과적입니다.

교수 개념

성능을
set_time_limit(0); 

$baseFile = "log.txt"; 
$tempFile = $baseFile . ".temp"; 

touch($tempFile); 

$findAndReplace = array("abc" => "","efg"=>"WWW"); 

$fileTemp = fopen($tempFile, "a+"); 
$fileBase = fopen($baseFile,"r"); 

while (!feof($fileBase)) { 
    $var = trim(fgets($fileBase)); 
    if (array_key_exists($var, $findAndReplace)) { 
     var_dump($var); 
     $var = $findAndReplace[$var]; 
    } 
    if (!empty($var)) 
     fwrite($fileTemp , $var . PHP_EOL); 
} 

fclose($fileBase); 
fclose($fileTemp); 
unlink($baseFile); 
rename($tempFile, $baseFile); 
0

의는 PHP를 사용하지 마십시오.

그러나 당신이 주장하는 바에 따르면, 하나의 대체 작업이 필요한 경우 전체 파일을 읽고 줄을 (문자열로) 바꾸어서 다시 작성하십시오. 나는. 파일을 별도의 줄로 나누지 마십시오. 필요 이상으로 느려질 수 있습니다. 트릭에

이 정상적으로은 :

$input = file_get_contents($filename_in); 

$find = "abc.."; 

$find_q = preg_quote($find,'/'); 
$output = preg_replace("/^$find_q(\n|\$)/m","",$input); 

file_put_contents($filename_out,$output); 

은 후행 줄 바꿈을 포함하여 정확히 $find을 포함하는 라인을 제거합니다. 마지막 행이 \n이 종료되지 않은 경우에도 계속 제거됩니다.

이 라인이있는 경우 테스트하기 위해 비슷한 접근 방식 걸릴 :

$find_q = preg_quote($find,'/'); 
if (!preg_match("/^$find_q(\n|\$)/m",$input)) 
{ 
    $input .= $find."\n"; // note: this assumes that $input is \n terminated 
} 
관련 문제