我想从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
它将全部删除happy
和smile
。但我只想保留一个快乐和一个微笑,而不是全部删除它们
我对PHP不太了解,请帮帮我
答案 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] = '';
}
}