- Регистрация
- 27.09.2019
- Сообщения
- 69
- Благодарностей
- 44
- Баллы
- 18
Приветствую.
Начал вникать в linq и написал под свои задачи пару сниппетов, думаю будет полезно тем кто парсит почты или покупает микс базы.
Делюсь
Первый читает файл с базой мэйлов, группирует по доменам и сортирует по количеству совпадений
Далее, нужно проанализировать полученные результаты и в случае необходимости отредактировать swtich во втором сниппете, который раскладывает строки из базы в отдельные файлы.
Если будет ругаться на ZennoLab.OwnCode.CommonCode.SyncObject - добавьте в проект директивы using и общий код
Начал вникать в linq и написал под свои задачи пару сниппетов, думаю будет полезно тем кто парсит почты или покупает микс базы.
Делюсь
Первый читает файл с базой мэйлов, группирует по доменам и сортирует по количеству совпадений
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);
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);