如何使用PHP(包括“原始”文件)删除文件中的重复行?

时间:2016-05-16 18:22:01

标签: php file duplicates

嗯,我的问题非常简单,但我没有找到合适的答案。我需要的是找到一种读取.txt文件的方法,如果有重复的行,则删除所有这些文件,而不是保留一个。例如,在.txt中包含以下内容:

1234
1233
1232
1234

输出应为:

1233
1232

因为代码必须删除重复的行,所有这些行。我搜索了所有网络,但它始终指向可以删除重复行但仍保留其中一行的答案,例如thisthisthat

我担心唯一的方法是读取x行并检查整个.txt,如果找到相同的结果,删除并删除x行。如果没有,请转到下一行。但是我正在检查的.txt文件有50百万行(~900Mb),我不知道我需要多少内存才能完成这类任务,所以我很感激这里的帮助。

3 个答案:

答案 0 :(得分:3)

逐行读取文件,并使用行内容作为关联数组的键,其值是行显示的次数的计数。完成后,写出所有值为1的行。这将需要与所有唯一行一样多的内存。

$lines = array();
$fd = fopen("inputfile.txdt", "r");
while ($line = fgets($fd)) {
    $line = rtrim($line, "\r\n"); // ignore the newline
    if (array_key_exists($line, $lines)) {
        $lines[$line]++;
    } else {
        $lines[$line] = 1;
    }
}
fclose($fd);
$fd = fopen("outputfile.txt", "w");
foreach ($lines as $line => $count) {
    if ($count == 1) {
        fputs($fd, "$line" . PHP_EOL); // add the newlines back
    }
}

答案 1 :(得分:0)

我怀疑只有一个功能可以完成你想要做的所有事情。所以,这将其分解为步骤......

首先,我们可以直接将文件加载到数组中吗?请参阅file命令的文档

$lines = file('mytextfile.txt');

现在,我拥有数组中的所有行。我想要计算每个条目中有多少。请参阅array_count_values命令的文档。

$counts = array_count_values($lines);

现在,我可以轻松遍历数组并删除co​​unt> 1

的所有条目
foreach($counts as $value=>$cnt)
  if($cnt>1)
    unset($counts[$value]);

现在,我可以将数组键(它们是值)转换为数组。

$nondupes = array_keys($counts);

最后,我可以将内容写到文件中。

file_put_contents('myoutputfile.txt', $nondupes);

答案 2 :(得分:0)

我认为我有一个更优雅的解决方案:

$array = array('1', '1', '2', '2', '3', '4'); // array with some unique values, some not unique

$array_count_result = array_count_values($array); // count values occurences

$result = array_keys(array_filter($array_count_result, function ($value) { return ($value == 1); })); // filter and isolate only unique values

print_r($result);

给出:

Array
(
    [0] => 3
    [1] => 4
)