【问题标题】:Alphabetize lines in file then remove duplicate lines按字母顺序排列文件中的行,然后删除重复的行
【发布时间】:2013-06-03 20:35:53
【问题描述】:

我正在尝试按字母顺序对长文本文件(数千行)进行排序,然后删除所有重复的行。

每一行只包含一个单词,我需要每个单词,一个单词行,按字母顺序排列。然后我希望删除所有重复的行,并将结果(排序和唯一的列表)写入一个新的文本文件,每行一个单词。

我如何在 PHP 中做到这一点?

现在,我正在考虑如何做到这一点,我会用file() 读入文件,然后创建一个数组,其中的元素是每一行。然后我会按字母顺序对数组进行排序,使用array_unique() 删除重复项,然后将每个元素写入新文本文件中的新行。

我在该实现中遇到的问题是字母排序。

如果您可以帮助我完成我的实施,那么请这样做。

如果你有更好的方法来做我想做的事情,那么请分享!

【问题讨论】:

  • sort 不起作用吗?

标签: php string file sorting alphabetical


【解决方案1】:

就排序而言,我可能会使用 natcasesort: natcasesort

剩下的很简单,你应该可以按照你认为合适的方式实现它。

【讨论】:

    【解决方案2】:

    虽然效率不高,但可以这样下手:

    $lines = file('filename.txt');
    $lines = array_walk($lines, 'trim'); // Remove line-breaks.
    $sorted_lines = sort(array_unique($lines));
    

    【讨论】:

    • 我要做的唯一更改是将file('filename.txt') 更改为file('filename.txt', FILE_IGNORE_NEW_LINES) 并取消array_walk。
    • 我如何将$sorted_lines 写入新文件?这样每个元素都在一个新行上?
    • 我正在尝试将$sorted_lines 写入一个新文件,但我得到的只是一个空白文本文件。这是我的代码:pastebin.com/x4P1SkCK
    • 您可以使用file_put_contents。很简单:file_put_contents('out_file.txt', implode("\n", $sorted_lines));
    【解决方案3】:

    您自己最简单的方法是实现bubble sort

    wiki 页面已经足够好了,但我会为你做一份简短的简历。

    假设您要对 5 个单词进行排序

    Bword
    Aword
    Cword
    Eword
    Dword
    

    您可以使用strcmp() 轻松地对两个单词进行排序

    问题是,如何对所有内容进行排序?

    您需要从第一个到最后一个比较每对单词,并根据字母顺序更改它们的位置。

    第一对是

    Bword
    Aword
    

    会变成

    Aword
    Bword
    

    然后你需要从一个单词开始并配对

    Bword with
    Cword
    

    如果不是你交换它们的好顺序,如果不是,你不。

    这样做一次,您会将最后一个字母单词放在数组的末尾。 然后你只需要重复这个次数等于你拥有的单词数。

    这应该让你开始。

    【讨论】:

      【解决方案4】:

      我会为此从 PHP 调用 bash 命令。 如果您的代码在 Linux 上,并且 PHP 配置中允许执行 exec:

      exec("sort " . $pathToOriginalFile . " | uniq > " . $pathToSortedUniqueFile);
      

      它确实会创建新的输出文件,但就我而言,它是迄今为止最快和最优雅的解决方案,因为我需要在超过 1000 万行的文件上执行此操作,而服务器只需要 3-5 秒完成。

      要将其保存在同一个文件中,您可以这样做:

      exec("sort " . $pathToOriginalFile . " | uniq > " . $pathToSortedUniqueFile);
      exec("rm " . $pathToOriginalFile);
      exec("mv " . $pathToSortedUniqueFile . " " . $pathToOriginalFile); 
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-11
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        相关资源
        最近更新 更多