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 :: Удалить повторы слов в файле
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Помог: 10 раз(а)
Примерно вижу так:
1. Читаем файл-источник.
2. Сохраняем во временный файл весь словарь, т.е. первые слова до знака |.
3. Читаем временный файл построчно, каждую строку (одно слово) ищем в файле-источнике, если найдено и если слово стоит не на первой позиции, то удаляем.
Как сохранить? Пишем строки, в которых не нашли, в новый файл, в которых нашли тоже пишем в новый файл, но без повтора.
Когда дойдем до последней строки во временном файле, удалим временный файл, удалим старый файл и переименуем новый, присвоив ему имя старого.
Т.е. как я понимаю, надо взять первое слово, пробежаться по всему файлу, удалить, потом взять второе и т.д.
Тот код, который Вы написали, похоже, не является решением.
Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2015
Помог: 0 раз(а)
хорошо, нужно было описать изначально в задаче, дальше: в какой строке нужно удалять дубликат? если он есть? (Добавление)
Код работает:
тестовые данные data.txt
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Помог: 10 раз(а)
neokiev, я почему-то думаю, что решение не совсем верное.
Код несколько нарушил порядок в результате.
----- Март 2021. Бросил программирование
neokiev
Отправлено: 30 Сентября, 2015 - 21:46:34
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2015
Помог: 0 раз(а)
dcc0 пишет:
Код несколько нарушил порядок в результате.
Не вижу где? Пример можно?)
dcc0 пишет:
neokiev, я почему-то думаю, что решение не совсем верное.
Это одно из решений. Которое можно доработать, я подсказал направление.
dcc0
Отправлено: 30 Сентября, 2015 - 22:26:16
Участник
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Помог: 10 раз(а)
Было ROFL|asda
Стало ROFL asda
Тут нужно уточнение автора. Я так понимаю - это
своебразеый словарь синонимов. Тут может быть важным порядок следования знаков, количество строк. (Добавление)
Проще говоря, пример автора и Ваш результат мало изоморфны.
Суть даже не в этом, задача до конца не сформулирована. Автор, если есть возможность приведите полный пример файла, и уточните в каких случаях удалять, спасибо.
seowin
Отправлено: 01 Октября, 2015 - 08:24:51
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Апр. 2015
Нужно, чтобы каждое слово в файле встречалось всего 1 раз.
Т.е. алгоритм следующий:
1. разбиваем строку на слова
2. ищем вхождение каждого слова в каждой строке последующей строке
3. если вхождение найдено, заменяем его на ""
На выходе должен быть файл, в котором:
а) строки имеют такой же вид, как в первоначальном файле
б) заменены все повторы слов на ""
Ничего страшного, если будут строки такого вида:
абордаж||сцепка|свалка
Т.е. будут рядом две вертикальные черты "||". Главное, чтобы в пределах разных строк не было повторов слов.
Зачем это все надо:
Далее этот файл поместится в БД. При выборке какого-то конкретного одного слова, база должна возвращаться одну строку.
Сейчас же из-за повторов слов в разных строках база возвращает несколько строк, в которых находит вхождение заданного слова.
neokiev
Отправлено: 01 Октября, 2015 - 10:08:32
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2015
Помог: 0 раз(а)
А что мешает доработать скрипт который я написал выше.
используй var_dump() или xdebug и смотри где и почему слово удалилось.
И еще если вы будете использовать базу то, есть еще один вариант:
1) Можно читать из файла построчно и записывать в базу, и проверять нет ли такой записи в базе, если слово существует то не записывать, главное правильно структуру базы сделать.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.