比较文本差异并将差异显示在邮件中
在做一些监测更新任务中,我们可能需要比较两个文本文件的差异,并将差异显示在邮件中。
以下是 C#中如何实现的。
比较文本差异
通过”文本差异比较算法”的技术来比较两个字符串,并找出它们之间的差异部分。其中最常见的算法之一是”最长公共子序列”算法。
当然,在实际的开发中,我们不需要自己实现这个算法,因为已经有现成的库可以使用。比如,DiffPlex
库。
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
| using DiffPlex; using DiffPlex.DiffBuilder; using DiffPlex.DiffBuilder.Model;
var differ = new Differ(); var inlineBuilder = new InlineDiffBuilder(differ);
var diff = inlineBuilder.BuildDiffModel("Hello World", "Hello World!");
foreach (var line in diff.Lines) { switch (line.Type) { case ChangeType.Inserted: Console.WriteLine($"Inserted: {line.Text}"); break; case ChangeType.Deleted: Console.WriteLine($"Deleted: {line.Text}"); break; default: Console.WriteLine($"Unchanged: {line.Text}"); break; } }
|
当比较的文本较大时,可能会有换行,可以把换行符去掉再比较。
1 2 3
| diffModel.Lines.RemoveAll(line => string.IsNullOrWhiteSpace(line.Text));
|
发送邮件
在 C# 中发送邮件SmtpClient
类,以下是如何生成一个 html 格式的邮件 body。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| StringBuilder emailBody = new StringBuilder(); emailBody.AppendLine("<html><body>"); emailBody.AppendLine("<h1>Diff Report</h1>");
foreach (var line in diff.Lines) { switch (line.Type) { case ChangeType.Inserted: emailBody.AppendLine($"<p style='color:green;'>{line.Text}</p>"); break; case ChangeType.Deleted: emailBody.AppendLine($"<p style='color:red;'>{line.Text}</p>"); break; default: emailBody.AppendLine($"<p>{line.Text}</p>"); break; } }
emailBody.AppendLine("</body></html>");
|
以上就可以把差异显示在邮件中了,其中 color:green
表示新增的内容标记为绿色,color:red
表示删除的内容标记为红色。