首页 文章

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

提问于
浏览
0

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

1234
1233
1232
1234

输出应该是:

1233
1232

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

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

3 回答

  • 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
        }
    }
    
  • 0

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

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

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

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

    $counts = array_count_values($lines);
    

    现在,我可以轻松地遍历数组并删除count> 1的所有条目

    foreach($counts as $value=>$cnt)
      if($cnt>1)
        unset($counts[$value]);
    

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

    $nondupes = array_keys($counts);
    

    最后,我可以将内容写入文件 .

    file_put_contents('myoutputfile.txt', $nondupes);
    
  • 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
    )
    

相关问题