using System.Text; using System.Text.RegularExpressions; namespace MailFromWho { internal class Format { private readonly Settings _settings; public Format(Settings settings) { _settings = settings; } internal void CreateCSV() { string? line; Dictionary> addresses = new Dictionary>(); // Read the file and display it line by line. var inFile = new System.IO.StreamReader(_settings.IntermediateFile); using (var outFile = new System.IO.StreamWriter(_settings.CsvFile)) { while ((line = inFile.ReadLine()) != null) { char[] quotes = { '\"' }; var emailAddress = ExtractEmails(line); if (emailAddress != null) { emailAddress = emailAddress.ToLower(); var alias = line.Replace($"<{emailAddress}>", "").Trim().Trim(quotes); if (addresses.ContainsKey(emailAddress)) { var aliasses = addresses[emailAddress]; if (!aliasses.Contains(alias)) { aliasses.Add(alias); } } else { var aliasses = new List(); if (!string.IsNullOrEmpty(alias)) { aliasses.Add(alias); } addresses.Add(emailAddress, aliasses); } } } List>> addressList = addresses.ToList(); addressList.Sort( delegate (KeyValuePair> pair1, KeyValuePair> pair2) { var emailRegex = new Regex(@"\w+([-+.]\w+)*@(?\w+([-.]\w+)*\.\w+([-.]\w+)*)", RegexOptions.IgnoreCase); var domain1 = emailRegex.Match(pair1.Key).Groups["domain"].Value; var domain2 = emailRegex.Match(pair2.Key).Groups["domain"].Value; return domain1.CompareTo(domain2); } ); foreach (var address in addressList) { var sb = new StringBuilder(address.Key); foreach (var alias in address.Value) { sb.Append(',').Append(alias); } var outLine = sb.ToString(); System.Console.WriteLine(outLine); outFile.WriteLine(outLine); } } inFile.Close(); } public string? ExtractEmails(string lineIn) { var emailRegex = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.IgnoreCase); //find items that matches with our pattern var emailMatches = emailRegex.Matches(lineIn); foreach (Match emailMatch in emailMatches) { return emailMatch.Value; } return null; } } }