我正在尝试按字母顺序对长文本文件(数千行)进行排序,然后删除任何重复的行。
每行只包含一个单词,我需要每个单词,一个单词行,按字母顺序排列。然后,我希望删除任何重复的行,并将结果(排序和唯一列表)写入一个新的文本文件,每行一个单词。
如何在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);
希望有所帮助