2009-09-10 10 views
6

Ho diversi file XML piuttosto grandi che rappresentano dati esportati da un sistema che deve essere utilizzato da un fornitore di terze parti. Stavo tagliando i risultati a 2.500 record per ogni file XML perché i file diventano enormi e non gestibili altrimenti. Tuttavia, il fornitore di terze parti mi ha chiesto di combinare tutti questi file XML in un singolo file. Ci sono 78 di questi file XML e hanno una dimensione totale di oltre 700 MB! Pazzesco, lo so ... quindi, come andresti a combinare questi file per soddisfare il venditore usando C#? Speriamo che non v'è un vero e proprio modo efficace per fare questo senza leggere in tutti i file in una sola volta utilizzando LINQ :-)Qual è il modo più efficace in C# per unire più di 2 file xml con lo stesso schema insieme?

risposta

4

ho intenzione di andare su un arto qui e supponiamo che il vostro XML sembra qualcosa di simile:

<records> 
    <record> 
    <dataPoint1/> 
    <dataPoint2/> 
    </record> 
</records> 

Se questo è il caso, vorrei aprire un flusso di file e scrivere la parte <records>, poi in sequenza aprire ogni file XML e scrivere tutte le linee (tranne il primo e l'ultimo) su disco. In questo modo non hai enormi stringhe in memoria e tutto dovrebbe essere molto, molto veloce da programmare ed eseguire.

public void ConsolidateFiles(List<String> files, string outputFile) 
{ 
    var output = new StreamWriter(File.Open(outputFile, FileMode.Create)); 
    output.WriteLine("<records>"); 
    foreach (var file in files) 
    { 
    var input = new StreamReader(File.Open(file, FileMode.Open)); 
    string line; 
    while (!input.EndOfStream) 
    { 
     line = input.ReadLine(); 
     if (!line.Contains("<records>") && 
      !line.Contains("</records>")) 
     { 
     output.Write(line); 
     } 
    } 
    } 
    output.WriteLine("</records>"); 
} 
+0

Questo sarà il modo più veloce, ma è un po '"hacky". –

+0

Concordato, "hacky" nel migliore dei casi: p Il DataSet.Merge sembra molto più elegante, ma non ho idea di quanto sarebbe efficiente la memoria. – JustLoren

+0

Ho inserito lo schema in ogni file XML, quindi questo diventerebbe ancora più "hacky" –

2

Usa DataSet.ReadXml(), DataSet.Merge() e DataSet.WriteXml(). Lascia che il framework faccia il lavoro per te.
Qualcosa di simile a questo:

public void Merge(List<string> xmlFiles, string outputFileName) 
    { 
    DataSet complete = new DataSet(); 

    foreach (string xmlFile in xmlFiles) 
    { 
     XmlTextReader reader = new XmlTextReader(xmlFile); 
     DataSet current = new DataSet(); 
     current.ReadXml(reader); 
     complete.Merge(current); 
    } 

    complete.WriteXml(outputFileName); 
    } 

Per ulteriori descrizione ed esempi, dare un'occhiata a this article da Microsoft.

+0

Questa è stata la via originale che ho seguito. Il problema è che il processo ha finito per utilizzare più di un gig di RAM! –

Problemi correlati