【问题标题】:c# Compare two text files and generate a new one with differencesc#比较两个文本文件并生成一个有差异的新文件
【发布时间】:2012-10-28 17:01:49
【问题描述】:

我正在寻找快速比较 2 个文本文件(+-15000 行)并获得两个文件中不同的输出字符串的最佳方法。 第一个是旧库存,新库存是当前库存,我想生成第三个包含 file2 和 file1 之间不同的字符串。 (这 2 个文件中有 95% 是相似的)。

【问题讨论】:

  • 你能描述一下在这种情况下“相似”是什么意思吗?您是否需要以编程方式执行此操作,或者您只是想要一个工具来进行比较(如WinMerge)?
  • 它在相同的顺序中基本相同,但可能缺少项目,目标是以编程方式完成,谢谢。

标签: c# file text compare


【解决方案1】:

非常简单的方法,假设相似表示相等

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

您可以使用foreach 来枚举行。

【讨论】:

  • 如果 OP 证明该假设是正确的,我将投票赞成
  • 请注意,您需要通过ToList() 实现查询,或者使用File.ReadAllLines 来避免ObjectDisposedException,如果您想同时使用这两个序列。 File.ReadLines 流式传输这些行,一旦完成,底层流就会关闭。尽管如此,我仍然显示ReadLines,因为它是内存消耗方面的最佳选择。
  • ReadLines 和 ReadAllLines 之间没有性能差异吗?如果 15000l 的文件没有区别,我将使用 readAllLines,谢谢
  • @OwenS:有很大的不同:ReadLines 将流式传输行(如Streamreader)而ReadAllLines 会将所有行读入String[] (在记忆中)。所以第一个不会使用内存,第二个会全部放入内存。所以如果你有足够的内存并且文件不是太大你可以使用File.ReadAllLines。请注意,内存消耗和性能不一定相关。
  • 我知道这是一个老问题,但是您将如何处理大文件,例如 1 gig 或更多?我尝试了这个答案,并在使用 ienumerable 时特别​​结束了内存异常
【解决方案2】:

您可以使用来自 Google 的 this diff 库。查看 diff_main 方法,它接受 2 个字符串并返回差异列表。

【讨论】:

【解决方案3】:

如果输出顺序相同,直接比较行。当其他文件中缺少该值时,您可能需要跳过行。

但是,如果输出不同,那么您可能需要将文件加载到内存中,并从一个文件到另一个文件中查找相关的库存项目。然后在未找到或不同时做任何你需要的事情。

【讨论】:

  • +1 如果顺序不变,算法应该是相当简单高效的。
  • 库存主要是带参数的目录列表,如果一个文件被删除了,会有一个丢失的项目,但顺序是一样的,谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多