Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#比较两个文本文件并生成一个有差异的新文件_C#_File_Text_Compare - Fatal编程技术网

c#比较两个文本文件并生成一个有差异的新文件

c#比较两个文本文件并生成一个有差异的新文件,c#,file,text,compare,C#,File,Text,Compare,我正在寻找最好的方法来快速比较两个文本文件(+-15000行),并获得两个文件中不同的输出字符串。 第一个是旧库存,新库存是当前库存,我想生成第三个库存,其中包含file2和file1之间不同的字符串。(两个文件中有95%类似)。如果输出顺序相同,请直接比较行。当另一个文件中缺少该值时,可能需要跳过第行 但是,如果输出不同,则可能需要将文件加载到内存中,并从一个文件到另一个文件查找相关的库存项目。然后在找不到或不同的情况下做任何你需要的事情。非常简单的方法,假设相似意味着相等: var file

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

如果输出顺序相同,请直接比较行。当另一个文件中缺少该值时,可能需要跳过第行


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

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

var file1Lines=File.ReadLines(file1Path);
var file2Lines=File.ReadLines(file2Path);
IEnumerable inFirstNotInSecond=file1Lines.Exception(file2Lines);
IEnumerable UnsecondNotInfirst=file2Lines.Exception(file1Lines);

您可以使用
foreach
枚举行。

您可以使用谷歌的diff库。看看diff_main方法,它接受这两个字符串并返回一个差异列表。

您能描述一下在这种情况下“相似”是什么意思吗?你需要用编程的方式来做这件事,还是你只需要一个工具来做一个区分(比如)?它基本上是一样的,顺序相同,但是项目可能会丢失,目标是用编程的方式来做,谢谢。+1如果顺序不变,该算法应该相当简单和高效。清单主要包含带参数的目录列表,如果文件已被删除,将有一个缺少的项目,但顺序相同,谢谢。如果OP证明该假设是正确的,我将提示您需要具体化查询,例如通过
ToList()
或使用
File.ReadAllLines
来避免
ObjectDisposedException
如果您想同时使用这两个序列。
File.ReadLines
对行进行流式处理,一旦完成,底层流就会关闭。尽管如此,我还是展示了
ReadLines
,因为它是内存消耗方面的最佳选择。ReadLines和ReadAllLines之间是否存在性能差异?如果15000l的文件没有差异,我将使用readAllLines,Thanks@OwenS:有一个很大的区别:
ReadLines
将对行进行流式处理(就像
Streamreader
),而
ReadAllLines
将所有行读取到
字符串[]
(内存中)。因此,第一个不会使用内存,第二个会将所有内容放入内存。因此,如果您有足够的内存且文件不太大,可以使用
file.ReadAllLines
。请注意,内存消耗和性能不一定相关。我知道这是一个老问题,但您将如何处理大文件,例如1G或更大的文件?我尝试了这个答案,但在使用ienumerableA时出现了内存不足异常。链接到解决方案是受欢迎的,但请确保您的答案在没有它的情况下是有用的:这样您的其他用户就会知道它是什么以及为什么会出现,然后引用你链接到的页面最相关的部分,以防目标页面不可用。
var file1Lines = File.ReadLines(file1Path);
var file2Lines = File.ReadLines(file2Path);
IEnumerable<String> inFirstNotInSecond = file1Lines.Except(file2Lines);
IEnumerable<String> inSecondNotInFirst = file2Lines.Except(file1Lines);