2013-01-16 18 views
7

Sotto qui ho descritto un esempio di scenario:confrontare due file di testo linea per linea

"FILEA-database.txt" contiene i seguenti nomi:

KB200

KB300

KB400

"FileB-Slave.txt" contiene i seguenti nomi:

KB600

KB200

KB400

KB700

voglio mettere a confronto il "FILEA-database.txt" con "fileB-slave.txt" e lasciare che i valori mancanti essere compilati automaticamente nel file "FileA-Database.txt" ho anche bisogno di visualizzare i valori mancanti in un file di testo chiamato "Results.txt".

Il codice deve essere compatibile con C# (framework 4.0+) per favore !.

Ho bisogno di un approccio semplice, il mio non lavorare esattamente come lo voglio:

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 
     } 

risposta

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

Non è i file a causa di confronto standard, verrà considerato lo stesso se lo stesso insieme di linee ha sequenza diversa. –

+1

so che questa è una vecchia domanda, ma come gestirai file di grandi dimensioni, ad esempio 1 o più gig? ho provato questa risposta e ho finito per uscire dall'eccezione di memoria .. – Angelo

+0

@Angelo hai mai trovato qualcosa? – null

9

Dal momento che la tua domanda sembra che hai fatto alcuno sforzo ti darò solo un abbozzo.

  1. Leggere entrambi i file riga per riga, ad es. con File.ReadAllLines o File.ReadLines.
  2. Utilizzare il metodo Except di LINQ.
  3. Scrivi i risultati in un nuovo file.
+1

sto cercando, ho bisogno di un approccio semplice ... Pubblicato quello che ho fatto: p – Developman