2013-01-16 10 views
7

Beneath hier ich ein Beispiel-Szenario beschrieben:Vergleichen Sie zwei Textdateien, Zeile für Zeile

"FileA-Database.txt" enthält die folgenden Namen:

KB200

KB300

KB400

"FileB-Slave.txt" enthält die folgenden Namen:

KB600

KB200

KB400

KB700

Ich möchte die "FileA-Database.txt" mit "FileB-slave.txt" und lassen Sie die fehlenden Werte automatisch ausgefüllt werden, um vergleichen In der Datei "FileA-Database.txt" muss ich auch die fehlenden Werte in einer Textdatei namens "Results.txt" anzeigen.

Der Code muss bitte mit C# (Framework 4.0+) kompatibel sein !.

ich einen einfachen Ansatz brauchen, tut Mine arbeiten genau so, wie ich es will:

private void button_compare_Click(object sender, EventArgs e) 
     { 
      string fileA, fileB, fileC; 
      fileA = "database-critical.txt"; 
      fileB = "patchlist.txt"; 
      fileC = "result.txt"; 

      string alphaFilePath = fileA; 

      List<string> alphaFileContent = new List<string>(); 

      using (FileStream fs = new FileStream(alphaFilePath, FileMode.Open)) 
      using(StreamReader rdr = new StreamReader(fs)) 
      { 
       while(!rdr.EndOfStream) 
       { 
        alphaFileContent.Add(rdr.ReadLine()); 
       } 
      } 

      string betaFilePath = fileB; 

      StringBuilder sb = new StringBuilder(); 


      using (FileStream fs = new FileStream(betaFilePath, FileMode.Open)) 
      using (StreamReader rdr = new StreamReader(fs)) 
      { 
       while(! rdr.EndOfStream) 
       { 
        string[] betaFileLine = rdr.ReadLine().Split(Convert.ToChar(",")); 

        if (alphaFileContent.Contains(betaFileLine[0])) 
        { 
         sb.AppendLine(String.Format("{0}", betaFileLine[0])); 
        } 
       } 
      } 

using (FileStream fs = new FileStream(fileC, FileMode.Create)) 
     using (StreamWriter writer = new StreamWriter(fs)) 
     { 
      writer.Write(sb.ToString()); 
     } 
    } 

      //End 
     } 

Antwort

26
String directory = @"C:\Whatever\"; 
String[] linesA = File.ReadAllLines(Path.Combine(directory, "FileA-Database.txt")); 
String[] linesB = File.ReadAllLines(Path.Combine(directory, "FileB-Database.txt")); 

IEnumerable<String> onlyB = linesB.Except(linesA); 

File.WriteAllLines(Path.Combine(directory, "Result.txt"), onlyB); 
+0

Es ist nicht Standard-Vergleich durch Dateien die gleiche, wenn der gleiche Satz von Linien unterschiedlicher Sequenz in Betracht gezogen werden. –

+1

Ich weiß, das ist eine alte Frage, aber wie werden Sie mit großen Dateien zum Beispiel 1 Gig oder mehr umgehen? Ich habe versucht, diese Antwort und endete außerhalb des Speichers Ausnahme. – Angelo

+0

@Angelo haben Sie jemals etwas gefunden? – null

9

Da Ihre Frage scheint, wie Sie sich keine Mühe gemacht, was ich euch nur einen groben Überblick geben werde.

  1. Beide Dateien Zeile für Zeile lesen, z. mit File.ReadAllLines oder File.ReadLines.
  2. Verwenden Sie die Methode Except von LINQ.
  3. Schreiben Sie die Ergebnisse in eine neue Datei.
+1

Ich versuche, ich brauche einen einfachen Ansatz ... Posted was ich getan habe: p – Developman