我的问题很简单,但我没有找到正确的答案。我需要的是找到一种读取.txt文件的方法,如果有重复的行,请删除所有行,而不是保留一行。例如,在.txt中包含以下内容:
1234
1233
1232
1234
输出应为:
1233
1232
因为代码必须删除重复的行,所以所有的行都要删除。我搜索了所有的网络,但它总是指向删除重复行但保留其中一行的答案,比如这个、这个或那个。
恐怕唯一的方法是读取x行并检查整个.txt,如果它找到了相等的结果,则删除,并删除x行。如果没有,请切换到下一行。但是我正在检查的.txt文件有5000万行(~900Mb),我不知道我需要多少内存来完成这类任务,所以我很感激这里的帮助。
逐行读取文件,并将行内容用作关联数组的键,该数组的值是该行出现次数的计数。完成后,写出所有值仅为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
}
}
我怀疑是否只有一个函数可以完成所有你想做的事情。。。
首先,我们可以将文件直接加载到数组中吗?参见file
命令的文档
$lines = file('mytextfile.txt');
现在,我有一个数组中的所有行。我想数一下我的每一个条目有多少。请参阅有关array_count_values
命令的文档。
$counts = array_count_values($lines);
现在,我可以轻松地循环遍历数组,并删除计数>1 的任何条目
foreach($counts as $value=>$cnt)
if($cnt>1)
unset($counts[$value]);
现在,我可以将数组键(即值)转换为数组。
$nondupes = array_keys($counts);
最后,我可以将内容写入一个文件。
file_put_contents('myoutputfile.txt', $nondupes);
我想我有一个更优雅的解决方案:
$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
)