0

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

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

我怎样才能在 PHP 中做到这一点?

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

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

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

或者

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

4

4 回答 4

1

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

其余的非常简单,您应该能够按照您认为合适的方式实现它。

于 2013-06-07T13:55:26.250 回答
1

虽然效率不是很高,但你可以从这个开始:

$lines = file('filename.txt');
$lines = array_walk($lines, 'trim'); // Remove line-breaks.
$sorted_lines = sort(array_unique($lines));
于 2013-06-07T13:57:51.847 回答
0

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

希望能帮助到你

于 2015-04-30T12:06:22.377 回答
0

自己做的最简单的方法是实现冒泡排序

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

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

Bword
Aword
Cword
Eword
Dword

您可以使用strcmp()轻松地对彼此之间的 2 个单词进行排序

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

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

第一对将是

Bword
Aword

并且会变成

Aword
Bword

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

Bword with
Cword

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

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

那应该让你开始。

于 2013-06-07T14:20:29.540 回答