Пишем уникализатор email'ов
У меня часто возникает необходимость что-либо уникализировать.
К примеру вам в руки попала база email'ов, количество которых свыше 100 000 штук. Ясное дело, руками уникализировать 100 тысяч email'ов невозможно.
Если у вас похожая ситуация - эта статья вам в помощь. Я покажу и представлю исходник уникализатора email'ов.
Разумеется адаптировать данный уникализатор под любые другие данные - раз плюнуть, необходимо будет лишь переписать регулярку.
Ключевой момент: это не просто уникализатор, это парсер. К примеру у вас не просто файлик с email'ами, а файлик в котором кроме целевых данных еще куча всего: телефоны, имена, даты и т.д.
Данный уникализатор найдет все email'ы.
Итак, исходные данные: ~2-3 тысячи файлов с беспорядочными данными, среди которых предполагается наличие email-адресов.
Структура данных: 5 каталогов, в которых еще несколько уровней каталогов. Примерно на 3-5-м уровнях расположены файлы SQL,TXT,XLS.
Исходя из этого, обходить дерево дирректорий будем рекурсивно начиная с корневого каталога.
Кратко план действий:
- Формирование массива файлов путем обхода дерева каталогов.
- Отсечение файлов, которые уже помочены как "спарсеные" (чтоб можно было дозаливать новые файлы с email'ами, не боясь, что старые будут парситься снова)
- Обход массива файлов с проходом регуляркой по каждому, формируя массив найденных email'ов
- Обход найденных email'ов и добавление в целевой массив только новых + сразу же вставка в БД.
- Запись в БД о том, что файл "спарсен"
Почему я записываю в БД по ходу дела?
Потому что, наврятли у вас TimeOut на сервере установлен в более чем 1 минуту)))
У меня TimeOut ожидания выставлен в 10 минут. И за эти 10 минут успевает обойти лишь 3000 файлов))) А у меня ведь никакой нибудь там хостичег, у меня - NetAngels VDS-4.
Приступим.
Начнем с объявления констант:
Пишем рекурсивную функцию обхода дерева каталогов с любым количеством уровней для поиска файлов:
Функция возвращает массив файлов, как и обещал.
Еще нам понадобится функция поиска email'ов в файле.
Не вижу смысла объяснять каждую строку - привожу код. Если что-то неясно - жду вопрос в комменте.
Самая простая регулярка: до собаки не ограничиваем, после - тоже. После точки на домен 1-го уровня даем 2-3 символа.
И наконец, основная часть контроллера. Класс писать не стал, т.к. тут всего-лишь 2 SQL-запроса и 2 функции, не вижу необходимости писать класс))
Единственное что тут может показаться странным начинающему PHP-разработчику это передача пораметра по ссылке, а именно:
Т.е. при таком подходе в функции не создается копия принятого параметра, а используется тот, что передан.
Я считаю: это всяко лучше чем использовать global.
Надеюсь, никого не смутил мой класс DB. Его реализация тривиальна, в коде юзаю функции query и insert.
В результате у нас в БД уникальные email'ы из всех файлов, расположенных в ROOT)))))
Привожу код целиком. Полностью рабочий, вам осталось, только заменить методы моего класса DB на свои.