我正在尝试按字母顺序对长文本文件(数千行)进行排序,然后删除任何重复的行。
每行只包含一个单词,我需要每个单词,一个单词行,按字母顺序排列。然后我希望删除任何重复的行,并将结果(已排序和唯一的列表)写入一个新文本文件,每行一个单词。
我如何在PHP中执行此操作?
现在,我正在考虑如何执行此操作,我将使用file()
在文件中读取,然后创建一个元素为每行的数组。然后我会按字母顺序对数组进行排序,使用array_unique()
删除重复项,然后将每个元素写入新文本文件中的新行。
我在该实现中遇到问题的问题是字母排序。
如果您可以帮助我实施,请执行此操作。
或
如果您有更好的方法来做我想做的事情,请分享!
答案 0 :(得分:1)
就这种情况而言,我可能会使用natcasesort: natcasesort
其余部分非常简单,您应该能够按照自己的意愿实施它。
答案 1 :(得分:1)
虽然效率不高,但您可以从这开始:
$lines = file('filename.txt');
$lines = array_walk($lines, 'trim'); // Remove line-breaks.
$sorted_lines = sort(array_unique($lines));
答案 2 :(得分:0)
最简单的方法是实现bubble sort。
维基页面非常适合制作,但我会为您快速制作简历。
假设您想要排序5个单词
Bword
Aword
Cword
Eword
Dword
您可以使用strcmp()
轻松地在彼此之间排序2个单词问题是,如何对一切进行排序?
您需要比较从第一个到最后一个的每对单词,并根据字母顺序更改其位置。
第一对将是
Bword
Aword
将成为
Aword
Bword
然后你需要从一个单词和配对中移动
Bword with
Cword
如果不是你交换它们的好订单,如果没有,你就不会。
通过这样做,您将把最后一个字母词放在数组的末尾。 然后你必须重复这个次数等于你拥有的单词数量。
这应该让你开始。
答案 3 :(得分:0)
我为此调用PHP的bash命令。 如果您的代码在Linux上,并且PHP配置允许使用exec:
<int-sftp:inbound-channel-adapter id="sftpAdapter"
channel="ftpChannel"
....
local-filter="acceptAllFileFilter"/>
<bean id="acceptAllFileFilter" class="org.springframework.integration.file.filters.AcceptAllFileListFilter"/>
然而它确实创建了新的输出文件,但在我的情况下,它是迄今为止最快,最优雅的解决方案,因为我需要在超过1000万行的文件上执行此操作,并且服务器只需3-5秒即可完整。
要将其保存在同一个文件中,您可以执行以下操作:
exec("sort " . $pathToOriginalFile . " | uniq > " . $pathToSortedUniqueFile);
希望有所帮助