从大文件中删除重复的行

时间:2018-12-09 04:24:31

标签: php

我想从txt file中删除重复的行,仅保留唯一的行,但是文件太大,最大不能超过700mb,我在整个StackOverflow中进行了搜索,但是解决方案将占用大量内存,最后我看到了很多经过大量研究后使用的内存较少的简单方法,但它只删除重复的行,我希望它仅保留其中一行,而不是完全删除重复的行。 代码下方

$lines = array();
$fd = fopen("inputfile.txt", "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
    }
}

使用上面的代码(如果有)

happy
smile
stack
happy
smile
flow

它将全部删除happysmile。但我只想保留一个快乐和一个微笑,而不是全部删除它们

我对PHP不太了解,请帮帮我

4 个答案:

答案 0 :(得分:1)

我相信这可以满足您的需求,并且效率会更高。

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

答案 1 :(得分:0)

如果使用php,则可以使用array_unique函数

答案 2 :(得分:0)

如果您使用的是Linux系统,则可以使用反引号`运算符执行Shell命令。

<?php

$inputfile = escapeshellarg('test.txt');
$outputfile = escapeshellarg('unique.txt');
`sort $inputfile | uniq > $outputfile`;

答案 3 :(得分:0)

一种更简单的方法是不打扰行数,而是将行存储在数组中。如果数组中不存在新行,则将其写到输出中并将其添加。这也将通过一次而不是两次循环来完成。

$lines = array();
$input = fopen("a.txt", "r");
$output = fopen("outputfile.txt", "w");
while ($line = fgets($input)) {
    if (!in_array($line, $lines)) {
        fputs($output, $line);
        $lines[] = $line;
    }
}
fclose($input);
fclose($output);

当您在内存中存储每一行​​时,您可能仍然遇到内存问题,您可能必须尝试一下,看看它的性能如何。

对行使用键可能会更快,因为这不再需要扫描阵列,但是同样,您将不得不尝试...

while ($line = fgets($input)) {
    if (!array_key_exists($line, $lines)) {
        fputs($output, $line);
        $lines[$line] = '';
    }
}