按字母顺序排列文件中的行,然后删除重复的行


Alphabetize lines in file then remove duplicate lines

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

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

如何在PHP中做到这一点?

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

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

如果你能帮我实现,那么请这样做。

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

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

虽然效率不高,但您可以这样开始:

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

最简单的方法就是实现冒泡排序。

维基页面已经足够好了,但是我会为你快速制作一份简历。

假设你想对5个单词进行排序

Bword
Aword
Cword
Eword
Dword

使用strcmp()

可以很容易地对两个单词进行排序

问题是,如何对所有东西进行排序?

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

第一对应该是
Bword
Aword

And将变成

Aword
Bword

那么你需要从一个单词和配对

Bword with
Cword

如果不是正确的顺序你就交换,如果不是,你就不交换。

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

你应该可以开始了

我会从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); 

希望有所帮助