2013-06-07 2 views
0

Я пытаюсь сортировать длинный текстовый файл (тысячи строк) в алфавитном порядке, а затем удалять любые повторяющиеся строки.Алфавит строк в файле, а затем удалить повторяющиеся строки

Каждая строка содержит только одно слово, и мне нужно, чтобы каждое из этих слов, одно слово, было в алфавитном порядке. Затем я хочу, чтобы любые повторяющиеся строки были удалены, а результат (отсортированный и уникальный список) записывался в новый текстовый файл с одним словом на каждую строку.

Как это сделать на PHP?

Прямо сейчас, я думаю о том, как это сделать, и я бы читал в файле с file(), а затем создавал массив с элементами, являющимися каждой строкой. Затем я отсортировал массив в алфавитном порядке, используя array_unique(), чтобы удалить дубликаты, а затем записать каждый элемент в новую строку в новом текстовом файле.

Проблема, с которой я сталкиваюсь в этой реализации, - это сортировка по алфавиту.

Если вы можете помочь мне с моей реализацией, пожалуйста, сделайте это.

или

Если у вас есть лучший способ сделать то, что я пытаюсь сделать, то, пожалуйста, поделитесь!

+1

ли [роду] (http://in3.php.net/sort) не работает? –

ответ

1

Что касается рода, то я бы, вероятно, использовать natcasesort: natcasesort

Остальное является довольно тривиально, и вы должны быть в состоянии осуществить это, как вы считаете нужным.

1

Хотя это не очень эффективно, вы можете начать с этого:

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

только изменение, которое я сделал бы, это изменить 'file ('filename.txt')' to 'file ('filename.txt', FILE_IGNORE_NEW_LINES)' и nix array_walk. – Orangepill

+0

Как написать '$ sorted_lines' в новый файл? Итак, каждый элемент находится на новой строке? –

+0

Я пытаюсь написать '$ sorted_lines' в новый файл, но все, что я получаю, это пустой текстовый файл. Вот мой код: http://pastebin.com/x4P1SkCK –

0

Самый простой способ сделать это самостоятельно, чтобы реализовать bubble sort.

Вики-страница достаточно хороша, чтобы сделать это, но я сделаю быстрое резюме для вас.

Давайте предположим, что вы хотите отсортировать 5 слов

Bword 
Aword 
Cword 
Eword 
Dword 

Вы можете сортировать легко 2 слова между собой с strcmp()

Дело в том, как сортировать все?

Вам нужно будет сравнить каждую пару слов от первого до последнего и изменить их положение в зависимости от его алфавитного порядка.

первая пара будет

Bword 
Aword 

И станет

Aword 
Bword 

Затем нужно перейти от одного слова и спаривания

Bword with 
Cword 

, если это не хороший заказ вы замените их, если нет, вы этого не сделаете.

Сделав это, вы поместите последнее алфавитное слово в конец массива. Вам просто нужно повторить, что несколько раз, равное количеству слов, которые у вас есть.

Это должно вас начать.

0

Я бы назвал команды bash из PHP для этого. При условии, что ваш код на Linux с Exec разрешено в конфигурации PHP:

exec("sort " . $pathToOriginalFile . " | uniq > " . $pathToSortedUniqueFile); 

Это, однако создать новый выходной файл, но в моем случае это был безусловно самым быстрым и наиболее элегантное решение, как мне нужно, чтобы выполнить это на файл с более чем 10 миллионами строк, и серверу потребовалось всего 3-5 секунд.

Чтобы сохранить его в том же файл вы можете сделать это:

exec("sort " . $pathToOriginalFile . " | uniq > " . $pathToSortedUniqueFile); 
exec("rm " . $pathToOriginalFile); 
exec("mv " . $pathToSortedUniqueFile . " " . $pathToOriginalFile); 

Надеется, что это помогает

Смежные вопросы