2016-11-02 4 views
-1

Я пытаюсь сравнить два текстовых файла a.txt и b.txt, я хочу получить разницу между ними.
a.txt является результатом вчерашнего дня.
b.txt - текущий результат.
Трудно сказать, что я не узнал, чего не хватает в «b.txt» по сравнению с «a.txt», даже если бы в «b.txt» было добавлено что-то новое, эти новые объекты должны быть исключены ,
Два файла не упорядочены, так что индекс 1 в 'a.txt' может быть индексом 2 в 'b.txt'. Я сравниваю строку как «mano-mathias rønnow nørtoft».
Все, что я пробовал, просто заканчивается показом новых объектов.
Что я пробовал:Сравнение файлов .txt и получение разницы

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); 
+4

Ваш код основывается на строках, по существу, находящихся в синхронизации между двумя файлами, что является довольно серьезным предположением. Вам нужно уточнить, что такое единица, которую вы сравниваете - строки? персонажи? а также местонахождение каждого файла может быть добавлено или удалено - в любом произвольном месте в любом файле? Также есть два случая определенного подразделения, которые рассматриваются как одна вещь или две вещи? и т. д. Это не тривиально! – peterG

+3

Diffing files - это открытая и очень сложная проблема, однако она была решена в прошлом. Я предлагаю вам использовать существующую библиотеку вместо того, чтобы переопределять ее самостоятельно (если это не академическое упражнение). Например, DiffPlex: https://github.com/mmanela/diffplex – Dai

+1

Вы изобретаете колесо. Зачем? Если вы действительно настаиваете на повторной реализации, тогда посмотрите на установленные алгоритмы, такие как алгоритм Майерса, используемый утилитой 'diff': https://en.wikipedia.org/wiki/Diff_utility#Algorithm – STW

ответ

1

Это действительно зависит от того, насколько точно вы хотите, чтобы разница была и как быстро вы хотите, чтобы это было.

Простая реализация должна заключаться в том, чтобы получить все линии линии A и B, foreach в A, если 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 
+0

Это именно то, что мне нужно, Стив, не возражаете ли вы дать мне пример? –

+1

@ MathiasRønnowNørtoft код не проверен. просто чтобы показать идею – Steve

+0

Стив еще одна услуга, ive отредактировал мой вопрос. Любые идеи, почему он не работает? –

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); 


    } 
    } 

этой команды соответствует повтор строки \ п (. *?) \ Г \ п \ 1 \ г, когда это отсортировано

+0

Это работает, хотя у меня есть одна ошибка, я просто пытался иметь идентичные тексты, и одна строка, которая находится в них обоих, выскочила. и в «blanklines.txt» упоминается дважды. тексты похожи на 100 строк, так что wierd дает ошибку только в 1 строке? –

+0

Я не очень хорошо понимаю, в чем проблема может объяснить это лучше? (внутри вас вопрос) – jhonny625

+0

эта команда удаляет только одинаковые строки \ n (. *?) \ r \ n \ 1 \ r – jhonny625

Смежные вопросы