Format.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Text;
  2. using System.Text.RegularExpressions;
  3. namespace MailFromWho
  4. {
  5. internal class Format
  6. {
  7. private readonly Settings _settings;
  8. public Format(Settings settings)
  9. {
  10. _settings = settings;
  11. }
  12. internal void CreateCSV()
  13. {
  14. string? line;
  15. Dictionary<string, List<string>> addresses = new Dictionary<string, List<string>>();
  16. // Read the file and display it line by line.
  17. var inFile = new System.IO.StreamReader(_settings.IntermediateFile);
  18. using (var outFile = new System.IO.StreamWriter(_settings.CsvFile))
  19. {
  20. while ((line = inFile.ReadLine()) != null)
  21. {
  22. char[] quotes = { '\"' };
  23. var emailAddress = ExtractEmails(line);
  24. if (emailAddress != null)
  25. {
  26. emailAddress = emailAddress.ToLower();
  27. var alias = line.Replace($"<{emailAddress}>", "").Trim().Trim(quotes);
  28. if (addresses.ContainsKey(emailAddress))
  29. {
  30. var aliasses = addresses[emailAddress];
  31. if (!aliasses.Contains(alias))
  32. {
  33. aliasses.Add(alias);
  34. }
  35. }
  36. else
  37. {
  38. var aliasses = new List<string>();
  39. if (!string.IsNullOrEmpty(alias))
  40. {
  41. aliasses.Add(alias);
  42. }
  43. addresses.Add(emailAddress, aliasses);
  44. }
  45. }
  46. }
  47. List<KeyValuePair<string, List<string>>> addressList = addresses.ToList();
  48. addressList.Sort(
  49. delegate (KeyValuePair<string, List<string>> pair1,
  50. KeyValuePair<string, List<string>> pair2)
  51. {
  52. var emailRegex = new Regex(@"\w+([-+.]\w+)*@(?<domain>\w+([-.]\w+)*\.\w+([-.]\w+)*)",
  53. RegexOptions.IgnoreCase);
  54. var domain1 = emailRegex.Match(pair1.Key).Groups["domain"].Value;
  55. var domain2 = emailRegex.Match(pair2.Key).Groups["domain"].Value;
  56. return domain1.CompareTo(domain2);
  57. }
  58. );
  59. foreach (var address in addressList)
  60. {
  61. var sb = new StringBuilder(address.Key);
  62. foreach (var alias in address.Value)
  63. {
  64. sb.Append(',').Append(alias);
  65. }
  66. var outLine = sb.ToString();
  67. System.Console.WriteLine(outLine);
  68. outFile.WriteLine(outLine);
  69. }
  70. }
  71. inFile.Close();
  72. }
  73. public string? ExtractEmails(string lineIn)
  74. {
  75. var emailRegex = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*",
  76. RegexOptions.IgnoreCase);
  77. //find items that matches with our pattern
  78. var emailMatches = emailRegex.Matches(lineIn);
  79. foreach (Match emailMatch in emailMatches)
  80. {
  81. return emailMatch.Value;
  82. }
  83. return null;
  84. }
  85. }
  86. }