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

时间:2013-06-07 13:49:30

标签: php string file sorting alphabetical

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

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

我如何在PHP中执行此操作?

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

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

如果您可以帮助我实施,请执行此操作。

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

4 个答案:

答案 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);

希望有所帮助