比较.txt文件并获得差异

时间:2016-11-02 18:44:28

标签: c#

我正在尝试比较两个文本文件a.txtb.txt,我希望得到两者之间的区别。
a.txt是昨天的结果 b.txt是当前的结果 棘手的是,我想知道“b.txt”与“a.txt”相比缺少什么,即使在“b.txt”中可能添加了新内容,也需要排除这些新对象。登记/> 这两个文件没有排序,因此'a.txt'中索引1的内容可以是'b.txt'中的索引2。我正在比较像“mano - mathiasrønnownørtoft”这样的字符串。 我所有尝试过的只是最终显示新物体 我尝试了什么:

 string[] File1Lines = File.ReadAllLines(path);
 string[] File2Lines = File.ReadAllLines(newPath);
 List<string> NewLines = new List<string>();

for (int lineNo = 0; lineNo<File1Lines.Length; lineNo++)
  {
    if (!String.IsNullOrEmpty(File1Lines[lineNo]) && !String.IsNullOrEmpty(File2Lines[lineNo]))
    {
      if(String.Compare(File1Lines[lineNo], File2Lines[lineNo]) != 0)
        NewLines.Add(File2Lines[lineNo]) ;
    }
    else if (!String.IsNullOrEmpty(File1Lines[lineNo]))
    {
    }
    else
    {
      NewLines.Add(File2Lines[lineNo]);
    }
  }
  if (NewLines.Count > 0)
  {
    File.WriteAllLines(resultpath, NewLines);
  }

这只是给我合并的文件。希望我已经正确地解释了自己。

试过这个,为什么不起作用?它没有任何显示。

        List<string> a = File.ReadAllLines(path).ToList();
        List<string> b = File.ReadAllLines(newPath).ToList();

        List<string> copy = new List<string>(a);

        foreach (string s in copy)
        {
            if (b.Contains(s))
            {
                a.Remove(s);

            }
            else
            {
                continue;
            }
        }
        myWriter.WriteLine(a);

2 个答案:

答案 0 :(得分:1)

这实际上取决于你想要差异的准确程度以及你想要的速度。

一个简单的实现方法是获取A和B的所有行,A中的foreach行,如果B包含该行,则从A和B中删除该行一次。剩下的是A中的线但不是B中的线,反之亦然。

请注意,此方法不考虑排序,因此

Log 1  
C   
B   
A

Log 2  
A  
B   
C

被认为是相同的。

List<string> A;
List<string> B;

List<string> aCopy = new List(A);

foreach(string s in aCopy)
{
    if (B.Contains(s))
    {
        A.Remove(s);
        B.Remove(s);
    }
}

//Whats in A are whats missing in B
//Whats in B are whats missing in A

答案 1 :(得分:1)

您可以使用正则表达式命令

加入,排序和删除相等字符串
 using System;

    using System.Text;


     using System.Text.RegularExpressions;

   class Program


{

 static void Main()

{

    string strFile4xf = File.ReadAllText(@"a.txt");

    strFile4xf = Regex.Replace(    strFile4xf,     @"(.*?)\r", "$1a\r");
   File.WriteAllText(@"a1.txt", strFile4xf);



    string strFile4xe = File.ReadAllText(@"b.txt");

      strFile4xe = Regex.Replace(    strFile4xe,     @"(.*?)\r", "$1b\r");
   File.WriteAllText(@"b1.txt", strFile4xe);





        string s4 = File.ReadAllText(@"a1.txt"); 

   string s2 = File.ReadAllText(@"b1.txt"); 

  string sn = string.Concat(s4, s2);

  File.WriteAllText(@"join.txt", sn);

  var contents = File.ReadAllLines("join.txt");
       Array.Sort(contents);
    File.WriteAllLines("join.txt", contents);

     string strFile4x = File.ReadAllText(@"join.txt");

   strFile4x = Regex.Replace(    strFile4x,     @"\n(.*?)a\r\n\1b\r", "");
     File.WriteAllText(@"removeequal.txt", strFile4x);




   var contents2 = File.ReadAllLines("removeequal.txt");
       Array.Sort(contents2);
    File.WriteAllLines("removeequal.txt", contents2);




string strFile4x2 = File.ReadAllText(@"removeequal.txt");

 strFile4x2 = Regex.Replace(    strFile4x,     @"\n\r", "");
 File.WriteAllText(@"blanklines.txt", strFile4x2);


     }
  }

此命令与重复字符串\ n(。*?)\ r \ n \ 1 \ r \ n匹配时匹配