从文件中删除特定行

时间:2018-07-13 10:26:56

标签: php text

我有一个像这样的文本文件:

1
2
3
4
5
6
7
8
9
10

我想删除数字在这样的数组中的特定行:

$myfile='txt.txt';
$remove=array(1,3,6,7,10);
//wanna remove these lines

所以我尝试了这段代码,但是没有用,只是使文本加倍并破坏了所有内容:

<?php
$myfile='txt.txt';
$remove=array(1,3,5,7,10);
$lines=file($myfile);
$countline=sizeof($lines);
$data=file_get_contents($myfile);
for ($i=0; $i < $countline+1; $i++) { 
	if (in_array($i, $remove)) {
$editeddata=str_replace($lines[$i], "", $data);
 $removeline = file_put_contents($myfile, $editeddata.PHP_EOL , FILE_APPEND | LOCK_EX);

	}
}
?>
我不能正确使用((for)),我认为它只会破坏文本,因为它会删除一行又一行的行,并更改顺序,因此我应该有一条代码将其全部删除。 而且,请不要提供仅替换数字的代码,因为主文本文件不仅是数字,而且包含单词等。

非常感谢!

2 个答案:

答案 0 :(得分:3)

您正在读取文件两次(使用filefile_get_contents),我认为这会使以后的代码混乱。第一次调用时,您便拥有了所需的一切-文件中所有行的数组。您还使用str_replace删除内容,如果重复任何内容,这似乎有些危险。

我将其重构为仅根据行号对行数组进行过滤,然后通过一次操作将其写回到文件中:

$myfile = 'txt.txt';
$remove = [1, 3, 5, 7, 10];

// Read file into memory
$lines = file($myfile);

// Filter lines based on line number (+1 because the array is zero-indexed)
$lines = array_filter($lines, function($lineNumber) use ($remove) {
    return !in_array($lineNumber + 1, $remove);
}, ARRAY_FILTER_USE_KEY);

// Re-assemble the output (the lines already have a line-break at the end)
$output = implode('', $lines);

// Write back to file
file_put_contents($myfile, $output);

答案 1 :(得分:1)

如果文件适合内存,则可以执行以下简单操作:

$myfile='txt.txt';
$remove=array(1,3,6,7,10);
file_put_contents($myfile, implode(PHP_EOL,array_diff($file($myfile,FILE_IGNORE_NEW_LINES), $remove))); 

注意:因为$remove是否包含内容或要删除的行有点不确定,所以上面的代码删除了内容。如果要删除行,请将array_diff($file($myfile,FILE_IGNORE_NEW_LINES), $remove)更改为array_diff_keys($file($myfile,FILE_IGNORE_NEW_LINES), array_flip($remove))

如果文件很大,则需要诉诸某种流传输。我建议不要读取和写入同一文件,并且不要执行以下操作:

$myfile='txt.txt';    
$remove=array(1,3,6,7,10);
$h = fopen($myfile,"r");
$tmp = fopen($myfile.".tmp", "w");
while (($line = fgets($h)) !== false) {
      if (!in_array(rtrim($line, PHP_EOL), $remove)) {
          fwrite($tmp, $line);
      }
}
fclose($h);
fclose($tmp);
unlink($myfile);
rename($myfile.".tmp", $myfile);