Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
KeyDiWeb
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 15
#1

Нужен скрипт, чтобы проверить email на схожесть - C++

09.04.2015, 15:15. Просмотров 365. Ответов 2
Метки нет (Все метки)

Доброе время суток. Создаю тему в данном разделе, поскольку мой вопрос можно отнести к разным языкам как думаю.
Задача проста, но для несведущего в программировании сложна.
Есть база данных email, база большая, несколько десятков тысяч. Так вот попадаются порой схожие email, например:
c.h.e.a.po.akl.e.y.s.ou.t.l.et.au@gmail.com
c.hea.poa.kleysu.nglass.esa.us.ale@gmail.com
chea.poakley.su.n.g.la.sses.au.s.ale@gmail.com
chea.poa.kley.sungl.assesa.u.sal.e@gmail.com

Суть в том, что до @ порядок и количество букв одинаковое, только вот расположение точек разное. Нужно убрать такие email. Можно проверять на схожесть конечно на сайтах подобных, но там строку со строкой только, поодиночке. Возможно ли как то реализовать скрипт, который бы проверял по строкам, где по одному email, или что удобней таблицу, саму с собой для выявления и удаления таких email? Буду очень благодарен в помощи. Если есть наметки, или уже видели подобное где-то, или знаете и это довольно просто, прошу помочь.
Требовать готовый код, особенно если он трудоемкий даже не думал. С уважением, Дмитрий.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2015, 15:15     Нужен скрипт, чтобы проверить email на схожесть
Посмотрите здесь:
C++ нужен скрипт
Схожесть текстов (расстояние Левенштейна) C++
C++ Как сделать, чтобы мой скрипт в C++ повторялся
C++ Нужен алгоритм, которым можно проверить, правильно ли пользователь расставил скобки
Какой софт нужен, чтобы начать программировать на C++ C++
C++ Проверить, чтобы длина строки файла была не меньше двух символов
Проверить, можно ли переставить элементы массива так, чтобы получилась арифметическая прогрессия C++
Нужен совет: Какую библиотетеку подключить, чтобы в консоли русские символы были C++
C++ Builder Как сделать, чтобы при установке галочки в CheckBox выводился текст из ListBox, который мне нужен
Нужен листинг на С++ (даны два вектора, упорядоченные по возрастанию. Слить их в один вектор, так чтобы сохранилась упорядоченность) C++
Символьный массив: проверить, чтобы после каждого вхождения "1" шло парное вхождение "0" C++
Проверка email C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
09.04.2015, 16:19     Нужен скрипт, чтобы проверить email на схожесть #2
Если по памяти ограничений нет (речь о нескольких десятках мегабайт), то просто читать все адреса в std::set. Только set'у подсунуть компаратор, который будет сравнивать адреса, предварительно удалив оттуда все точки до символа @. В итоге получим множество уникальных адресов, которое можно сбросить в файл.
Но С++ не самый удачный выбор, проще может на питоне это сделать)
mymedia
190 / 190 / 48
Регистрация: 27.05.2011
Сообщений: 543
11.04.2015, 09:56     Нужен скрипт, чтобы проверить email на схожесть #3
Ну, вот, наверное, как-то так. Я думаю, на С++ будет всё-таки быстрее, чем на питоне. Сравнивать "вручную" я тоже решил ради скорости, чтобы не было лишних копирований. Конечно же, компилировать стоит с максимальной опитимизацией.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <set>
#include <string>
 
using namespace std;
    
/* функтор */
struct compare_without_dots {
    bool operator ()(const string &s1, const string &s2) {
        for (auto p1 = begin(s1), p2 = begin(s2); p1 != end(s1) and p2 != end(s2); p1++, p2++) {
            if (*p1 == '.' and p1+1 != end(s1)) p1++;
            if (*p2 == '.' and p2+1 != end(s2)) p2++;
            if (*p1 != *p2) return *p1 < *p2;
        }
        return false;
    }
};
 
int main() {
    string file_name;
    cout << "Введите имя файла с базой данных: ";
    getline(cin, file_name);
    ifstream in_file(file_name);
    cout << "Введите имя файла для результата: ";
    getline(cin, file_name);
    ofstream out_file(file_name);
 
    set<string, compare_without_dots> database;
    while (in_file) {
        string email;
        getline(in_file, email);
        database.insert(email);
    }
 
    copy(begin(database), end(database), ostream_iterator<string>(out_file, "\n"));
}

Можно попытаться использовать unordered_map, правда, в результате могут тогда исчезнуть какие-то неповторяющиеся адреса. Тут только надо правильно построить хеш-функцию.
Yandex
Объявления
11.04.2015, 09:56     Нужен скрипт, чтобы проверить email на схожесть
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru