Алфавитизируйте строки в файле, затем удалите повторяющиеся строки

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

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

Как я могу сделать это в PHP?

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

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

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

or

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


person Django Johnson    schedule 07.06.2013    source источник
comment
сортировка не работает?   -  person hw.    schedule 07.06.2013


Ответы (4)


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

Остальное довольно тривиально, и вы сможете реализовать его по своему усмотрению.

person Josh    schedule 07.06.2013

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

$lines = file('filename.txt');
$lines = array_walk($lines, 'trim'); // Remove line-breaks.
$sorted_lines = sort(array_unique($lines));
person hw.    schedule 07.06.2013
comment
единственное изменение, которое я бы сделал, это изменить file('filename.txt') на file('filename.txt', FILE_IGNORE_NEW_LINES) и отменить array_walk. - person Orangepill; 07.06.2013
comment
Как записать $sorted_lines в новый файл? Чтобы каждый элемент находился на новой строке? - person Django Johnson; 07.06.2013
comment
Я пытаюсь записать $sorted_lines в новый файл, но получаю только пустой текстовый файл. Вот мой код: pastebin.com/x4P1SkCK - person Django Johnson; 07.06.2013
comment
Вы можете использовать file_put_contents. Все просто: file_put_contents('out_file.txt', implode("\n", $sorted_lines)); - person hw.; 07.06.2013

Самый простой способ сделать это самостоятельно — реализовать сортировку пузырьком.

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

Допустим, вы хотите отсортировать 5 слов

Bword
Aword
Cword
Eword
Dword

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

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

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

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

Bword
Aword

И станет

Aword
Bword

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

Bword with
Cword

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

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

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

person Jay Zus    schedule 07.06.2013

Я бы для этого вызывал команды 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); 

Надеюсь, поможет

person Slobodan Antonijević    schedule 30.04.2015