使用C#比较两个文本文件并生成一个包含差异的新文件

4
我正在寻找一种最佳方法来快速比较两个文本文件(大约15000行),并获取输出字符串,这些字符串在两个文件中不同。 第一个文件是旧清单,第二个文件是当前清单,我想生成一个第三个文件,其中包含在file2和file1之间不同的字符串。 (95%的两个文件将是相似的)。

1
你能描述一下在这种情况下“相似”是什么意思吗?你需要以编程的方式来完成,还是只是想要一个类似于 WinMerge 的工具来进行比较差异? - vgru
它将主要按照相同的顺序,但可能会缺少某些项目,目标是通过编程实现,谢谢。 - OwenS
3个回答

11

非常简单的方法,假设相似意味着相等

var file1Lines = File.ReadLines(file1Path);
var file2Lines = File.ReadLines(file2Path);
IEnumerable<String> inFirstNotInSecond = file1Lines.Except(file2Lines);
IEnumerable<String> inSecondNotInFirst = file2Lines.Except(file1Lines);

您可以使用 foreach 枚举每一行。


如果OP的假设被证明是正确的,我会点赞。 - Hardrada
注意,您需要通过ToList()等方式将查询实例化,或者使用File.ReadAllLines来避免在同时使用两个序列时出现ObjectDisposedExceptionFile.ReadLines会流式读取行,并在完成后关闭底层流。我仍然展示了ReadLines,因为它在内存消耗方面是最佳选择。 - Tim Schmelter
ReadLines和ReadAllLines之间没有性能差异吗?如果对于一个15000行的文件没有差异,那我会使用ReadAllLines。谢谢。 - OwenS
3
@OwenS: ReadLines会像Streamreader一样逐行流式传输,而ReadAllLines会将所有行读入内存中的String[]。因此,第一个不会使用内存,而第二个将所有内容都放入内存中。如果您拥有足够的内存且文件不太大,则可以使用File.ReadAllLines。请注意,内存消耗和_性能_不一定相关。 - Tim Schmelter
我知道这是一个老问题,但是你如何处理大文件,例如1GB或更多?我尝试了这个答案,但最终遇到了内存不足异常,特别是在使用IEnumerable时。 - Angelo

3
你可以使用Google提供的diff库这个链接。查看diff_main方法,该方法接受两个字符串并返回差异列表。

欢迎提供解决方案的链接,但请确保您的答案在没有链接的情况下也是有用的:添加链接周围的上下文,以便您的同行用户了解它是什么以及为什么存在,然后引用您链接到的页面中最相关的部分,以防目标页面不可用。仅仅是一个链接的答案可能会被删除。 - Samuel Liew
图书馆现在可以在https://github.com/google/diff-match-patch上找到。 - undefined

1
如果输出顺序相同,则直接比较行。当另一个文件中的值缺失时,您可能需要跳过该行。
但是,如果输出不同,则可能需要将文件加载到内存中,并在另一个文件中查找相关库存项目。然后,在未找到或不同的情况下执行所需操作。

如果顺序不变,算法应该相当简单和高效。+1 - vgru
库存主要包含带参数的目录列表,如果文件已被删除,则会出现缺失的项目,但顺序不变,谢谢。 - OwenS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接