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
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>");
}
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.
Questa è stata la via originale che ho seguito. Il problema è che il processo ha finito per utilizzare più di un gig di RAM! –
- 1. Qual è il modo più efficace per abbinare i valori tra 2 tabelle in base alla data precedente più recente?
- 2. C#: qual è il modo più semplice per sottrarre tempo?
- 3. Il modo più efficace per rimuovere più sottostringhe dalla stringa?
- 4. Il modo più efficace di leggere il file
- 5. SQL unire, ottenendo più colonne con lo stesso nome
- 6. Qual è il modo più veloce per combinare due file xml in uno
- 7. Python è il modo più efficace per attendere l'input
- 8. Qual è il modo più efficace per scrivere un'istruzione select con una sottoquery "not in"?
- 9. Il modo più efficace per dividere le stringhe in Python
- 10. sql più efficace per il recupero
- 11. Qual è il modo più semplice per aggiornare lo schema mnesia?
- 12. Qual è il modo più efficace per trovare la distanza euclidea in 3d usando mysql?
- 13. Qual è il modo più rapido per controllare in modo programmatico la ben formata dei file XML in C#?
- 14. Qual è il modo più efficace per rappresentare i valori algebrici di tipo finito (non ricorsivo)?
- 15. Qual è il modo più efficace per scorrere un elenco in python?
- 16. Qual è la sequenza preferita da leggere C++ (e STL) efficace, più efficace ed efficace?
- 17. convalidare un file XML con più definizioni di schema
- 18. Come unire più file di patch?
- 19. Qual è il modo più poderoso per scorrere tutte le righe di più file?
- 20. Qual è il modo più efficace per tagliare/incollare in Visual Studio?
- 21. Il modo più efficace per spostare le serie temporali MultiIndex
- 22. Qual è il modo più veloce per unire due elenchi in python?
- 23. Qual è il modo più semplice per estendere un array numpy in 2 dimensioni?
- 24. Qual è il modo più semplice per rimuovere tutti gli attributi da un XML in C#?
- 25. Il modo più efficace per invertire l'ordine di un BitArray?
- 26. Qual è il modo più efficace per determinare se un grafico diretto è collegato singolarmente?
- 27. Qual è il modo più efficace per dichiarare le funzioni in Javascript?
- 28. Qual è il modo più semplice ed efficace per creare un heap minimo in Scala?
- 29. Qual è il modo più semplice per esportare un database SQLServer 2000 in XML?
- 30. Il modo più veloce ed efficiente per creare XML
Questo sarà il modo più veloce, ma è un po '"hacky". –
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
Ho inserito lo schema in ogni file XML, quindi questo diventerebbe ancora più "hacky" –