Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Удалить похожие (не идентичные) строки из файла
Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2014
Помог: 0 раз(а)
Всем доброго времени суток, помогите с таким заданием. Есть файл txt в нем строки не идентичные но похожие url.com/123/ree1, url.com/123/ree2, url2.com/123/ree1. Необходимо удалить строки в которых первые допустим 10 символов равны первым 10 символам следующей строки, с сохранением 1 строки, если пропуск строки то переход к следующей строке. С меня лучи добра в карму
p.s. Можете пнуть в нужном направлении функции substr_replace или игры с включением строк в массив с последующим каким то образом unsetom значений ключей.
Идея заключается в том, чтобы читать из одного файла дважды. Две переменные в цикле, одна "отстает" от другой, обе обрезаются до 10 символов и сравниваются. Запись происходит в другой файл, потом можно переименовать...
Я мог ошибиться, надо тестировать еще. (Добавление)
Собственно вот. И здесь уже можно выбрать, что писать в файл после else, buffer или buffer2,
т.е. либо четные, либо нечетные строки.
Но только пока не учел, что между строк могут быть пустые строки. Т.е если файл такой:
Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2014
Помог: 0 раз(а)
Да получилось, Спасибше огромное Вот только оно сравнивает первую строку с следующей и все а если значений одной строки больше чем 2 url.com/123/ree1, url.com/123/ree2, url.com/123/ree3, url.com/123/ree4, а надо что бы в живых осталась только первая строка На ответ не надеюсь и так подсобили попробую сам допилить )
p.s Хотя если я тут найду после неудачи правильный вараинт будет тоже клево
dcc0
Отправлено: 05 Сентября, 2014 - 21:52:07
Участник
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Итак, у нас три части: До этого скрипта можно сделать.
1. Цикл, который подсчитает количество строк в файле и сохранит в переменной.
2. Вторая часть: создается промежуточный файл и с помощью цикла все данные перегоняются в
него с удалением пустых строк, вероятно, можно применить функцию trim.
После этого этапа происходит переименование файлов, чтобы файл с удаленными строками стал как бы тем, из которого читали, делается три переименования, вводится промежуточный, какой-нибудь old_file.txt
3. Часть Третья. Последний скрипт будет искать совпадения, с последующим переименованием файлов, его можно загнать в функцию или в другой цикл и перезапустить столько раз, сколько значений в переменной, которая хранит значение количества строк. См. первую часть. Если делать чистый рекурсивный вызов, то можно избежать первой части. (Добавление)
cut
В принципе мы избежали рекурсии, но если много записей, то и циклов будет много.
Остается последнее ввести цикл в самое начало, который удалит пустые строки.
В конце я сделал удаление промежуточного файла - unlink. И значение для обрезки строк сейчас стоит 5 символов, обратите внимание на это при тестировании.
(Добавление)
Итог всей эпопеи.
У нас есть файл f.txt. В нем есть пустые и повторяющиеся строки:
Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2014
Помог: 0 раз(а)
Да волшебство вышло. Буду разбирать этот пример, так как то что я себе сначала на листе на программировал позорно и очень быстро было отправлено в корзину. Большое человеческое спасибо, надеюсь когда то дойти до уровня решения таких задач в такие сжатые сроки
dcc0
Отправлено: 05 Сентября, 2014 - 23:39:36
Участник
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Помог: 10 раз(а)
PakaKepstr Не за что.
В завершение хочу сказать, что поиск и удаление пустых строк - это все еще открытая проблема. Я считаю, что решать ее надо по другому, но пока не знаю, как.
Для себя недавно заметил, что написание псевдокода на русском языке сильно облегчает решение. Т.е. я вообще тоже обычно пишу на бумаге и считаю этот подход верным, но это обычно выглядит не как алгоритм, а как последовательные рассуждения. А далее, мне помогает написание уже алгоритма, но на русском, типа:
Переменная1=тому-то
Цикл (условие )
и т.д.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.