2009-07-02 8 views
2

Ich schreibe einen Rahmen für das Schreiben von Sammlungen in verschiedenen Formaten für ein Projekt bei meinem Arbeitgeber. Eines der Ausgabeformate sind Textdateien mit Trennzeichen (allgemein bekannt als CSV - obwohl CSVs nicht immer durch ein Komma getrennt sind).. NET eine begrenzte Textdatei schreiben

Ich verwende den Microsoft.Jet.OLEDB.4.0 Provider über OleDbConnection in ADO.net. Zum Lesen dieser Dateien ist es sehr schnell. Zum Schreiben ist es jedoch extrem langsam.

In einem Fall habe ich eine Datei mit 160 Datensätzen, wobei jeder Datensatz etwa 250 Felder enthält. Es dauert ungefähr 30 Sekunden, um diese scheinbar CPU-gebundene Datei zu erstellen.

Ich habe folgendes getan, was erhebliche Leistungssteigerungen zur Verfügung gestellt, aber ich kann an nichts anderes denken:

  1. einmal die Anweisung vorbereiten
  2. Mit unbenannte Parameter

Alle anderen Vorschläge, um dies zu beschleunigen?

+0

Wäre definitiv Code zu sehen, um Hilfe zu bieten. Ich habe einige C# -Code-CSV-Dateien geschrieben und sehe keine Performance irgendwo in der Nähe. – marcc

Antwort

5

Wie wäre es mit "nicht OleDbConnection" verwenden ... Schreiben von begrenzten Dateien mit TextWriter ist ziemlich einfach (beiseite fliehen). Zum Lesen, CsvReader.

+0

Ich habe meinen eigenen Code und einen StreamWriter geschrieben. Scheint gut für den Moment zu funktionieren ... Immer noch mit OLEBB zum Lesen, hat keine Leistungsprobleme von dem, was ich sehen kann. –

1

Ich habe eine kleine und einfache Reihe von Klassen bei meinem Arbeitgeber geschrieben, um genau das zu tun (Schreiben und Lesen von CSV-Dateien oder anderen flachen Dateien mit einer festen Feldlänge). Ich habe gerade die StreamWriter & StreamReader-Klassen verwendet, und es ist eigentlich ziemlich schnell.

0

Probieren Sie die System.Configuration.CommaDelimitedStringCollection, wie diesen Code hier, um eine Liste von Objekten zu einem TextWriter zu drucken.

public void CommaSeperatedWriteLine(TextWriter sw, params Object[] list) 
{ 
    if (list.Length > 0) 
    { 
     System.Configuration.CommaDelimitedStringCollection commaStr = new System.Configuration.CommaDelimitedStringCollection(); 

     foreach (Object obj in list) 
     { 
      commaStr.Add(obj.ToString()); 
     } 

     sw.WriteLine(commaStr.ToString()); 
    } 
} 
0

Werfen Sie einen Blick auf diesem LINQ to CSV-Bibliothek von Code-Projekt: http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

ich dies noch nicht verwendet haben, aber ich habe es für etwa ein Jahr jetzt in meiner Referenzdatei hat.

"Diese Bibliothek erleichtert die Verwendung von CSV-Dateien mit LINQ-Abfragen."

Verwandte Themen