Сортировка MIX базы почт

Регистрация
27.09.2019
Сообщения
69
Благодарностей
44
Баллы
18
Приветствую.

Начал вникать в linq и написал под свои задачи пару сниппетов, думаю будет полезно тем кто парсит почты или покупает микс базы.
Делюсь :ah:
Первый читает файл с базой мэйлов, группирует по доменам и сортирует по количеству совпадений

C#:
string file = project.Directory +  @"\emails_to_sort.txt"; //путь к файлу с базой почт. в данном случае прочитается файл emails_to_sort.txt из директории с проектом
string outFile = project.Directory + @"\hosts.txt"; // путь к файлу с результатами группировки
var list = new List<string>();
list.AddRange(File.ReadAllLines(file));

var hosts = list.Where(x => x.Contains("@")).Select(x => x.Split('@')[1].ToLower())
                .GroupBy(x => x).Where(x => x.Count() > 1).Select(x => x.Key + ":" + x.Count())
                .OrderByDescending(x => x.Split(':')[1].Length).ThenByDescending(x => x.Split(':')[1]).ThenBy(x => x);

File.WriteAllLines(outFile, hosts);
Далее, нужно проанализировать полученные результаты и в случае необходимости отредактировать swtich во втором сниппете, который раскладывает строки из базы в отдельные файлы.
C#:
var mails = new List<string>();
string    file = project.Directory +  @"\emails_to_sort.txt", //путь к файлу с базой почт. в данном случае прочитается файл emails_to_sort.txt из директории с проектом
        dir = project.Directory + @"\mails\"; //директория в которую будут сохранены результаты
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);

mails.AddRange(File.ReadAllLines(file));
long start = DateTimeOffset.Now.ToUnixTimeSeconds();

mails.AsParallel().ForAll(x =>
{
    string mailHost = string.Empty;
    try
    {
        mailHost = x.Split('@')[1].ToLower();
    }
    catch
    {
        mailHost = "bad";
    }
    switch (mailHost)
    {
        case "ukr.net":
        case "i.ua":
        case "meta.ua":
        case "icloud.com":
        case "bigmir.net":
        case "ua.fm":
        case "tut.by":
        case "email.ua":
        case "mail.com":
        case "gmail.com":
        case "aol.com":
        case "bymail.info":
        case "bad":
            break; //выше можно добавить или удалить домены, которые будут записываться в отдельные файлы
        case "yandex.ru":
        case "yandex.ua":
        case "ya.ru":
            mailHost = "yandex.ru"; //название файла в который будут записаны почты одного почтовика с разными доменами
            break;
        case "mail.ru":
        case "mail.ua":
        case "bk.ru":
        case "list.ru":
        case "inbox.ru":
            mailHost = "mail.ru";
            break;
        case "outlook.com":
        case "hotmail.com":
        case "hotmail.de":
        case "hotmail.fr":
        case "hotmail.it":
        case "hotmail.co.k":
        case "hotmail.es":
            mailHost = "microsoft";
            break;
        case "rambler.ru":
        case "lenta.ru":
        case "myrambler.ru":
        case "ro.ru":
            mailHost = "rambler.ru";
            break;
        case "gmx.com":
        case "gmx.de":
        case "gmx.net":
        case "gmx.at":
            mailHost = "gmx.com";
            break;
        case "yahoo.com.au":
        case "yahoo.com":
        case "yahoo.fr":
        case "yahoo.it":
        case "yahoo.de":
        case "yahoo.gr":
        case "yahoo.es":
        case "yahoo.ca":
        case "yahoo.com.ua":
            mailHost = "yahoo.com";
            break;
        case "gmail.ru":
        case "gmai.com":
        case "gmail.ua":
        case "gmal.com":
        case "gmail.com.ua":
        case "gmail.con":
        case "gmeil.com":
        case "gmil.com":
        case "qmail.com":
            x = x.Replace(mailHost, "gmail.com"); //если ресурс с которого парсите данные не требует подтверждение регистрации, могут попадаться почты с опечатками
            mailHost = "gmail.com";
            break;
        default:
            mailHost = "other"; //все почты, которые не совпадают с указанными выше - попадают в файл other
            break;
    }
    lock(ZennoLab.OwnCode.CommonCode.SyncObject)
    {
        try
        {
            using (StreamWriter writer = new StreamWriter(Path.Combine(dir, mailHost + ".txt"), true))
            {             
                writer.WriteLine(x);             
            }
        }
        catch
        {
            project.SendErrorToLog("Ошибка записи: " + mailHost + ":" + x, true);
        }
    }
});
long end = DateTimeOffset.Now.ToUnixTimeSeconds();
var time = end - start;
project.SendInfoToLog(string.Format("Список отсортирован за {0} сек.", time.ToString()), true);
Если будет ругаться на ZennoLab.OwnCode.CommonCode.SyncObject - добавьте в проект директивы using и общий код
 

cardelis

Новичок
Регистрация
03.09.2019
Сообщения
9
Благодарностей
6
Баллы
3
шикарно)
с месяц назад искал аналогичное решение для сортировки базы в 600к мыл. из ветки с бесплатными сниппетами подсказали как оптимизировать мой код, что сократило общее время с 6ти до 4х часов.
этим вариантом получилось за 1,5:ay:
 

tanichev

Client
Регистрация
14.08.2020
Сообщения
654
Благодарностей
761
Баллы
93
Регистрация
27.09.2019
Сообщения
69
Благодарностей
44
Баллы
18

Вложения

Последнее редактирование:
  • Спасибо
Реакции: BAZAg и tanichev

tanichev

Client
Регистрация
14.08.2020
Сообщения
654
Благодарностей
761
Баллы
93
Регистрация
27.09.2019
Сообщения
69
Благодарностей
44
Баллы
18
Спасибо!

Тысячу извинений, а как запустить в несколько потоков?
Сортировка базы и так происходит в "многопоточном" режиме благодаря расширению AsParallel()
Метод AsParallel() позволяет распараллелить запрос к источнику данных. Он реализован как метод расширения LINQ у массивов и коллекций. При вызове данного метода источник данных разделяется на части (если это возможно) и над каждой частью отдельно производятся операции.
А если имеете в виду запуск одновременной сортировки нескольких баз - просто скопируйте проект и запустите отдельно.
 
  • Спасибо
Реакции: tanichev

ggdngdgdgdn5

Новичок
Регистрация
14.11.2020
Сообщения
1
Благодарностей
0
Баллы
1
Senior Pomidor Ответьте в телеге, пожалуйста
 
Регистрация
27.09.2019
Сообщения
69
Благодарностей
44
Баллы
18

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)