Gibt es CSV-Lese- / Schreibbibliotheken in C #? [geschlossen]

111

Gibt es CSV- Lese- / Schreibbibliotheken in C #?

mrblah
quelle
68
Ich bin anderer Ansicht. Dies ist definitiv eine konstruktive Frage und das erste Ergebnis bei Google für .net csv library. Obwohl anekdotisch, ist meine Behauptung, dass diese Frage in den letzten sechs Jahren mehr als 22000 Mal gestellt wurde.
Shovavnik
5
wahr gesagt - erster Treffer auf Google
Robetto

Antworten:

107

Versuchen Sie es mit CsvHelper . Es ist so einfach zu bedienen wie FastCsvReader und schreibt auch. Ich war in der Vergangenheit sehr zufrieden mit FastCsvReader, aber ich brauchte etwas, das auch schreibt, und war mit FileHelpers nicht zufrieden.

Lesen:

var csv = new CsvReader( stream );
var myCustomTypeList = csv.GetRecords<MyCustomType>();

Schreiben:

var csv = new CsvWriter( stream );
csv.WriteRecords( myCustomTypeList );

Vollständige Offenlegung: Ich bin der Autor dieser Bibliothek.

Josh Close
quelle
3
Danke, Josh. Ich habe es ausprobiert und es war sowohl schnell als auch speichereffizient. Ich denke, die Dokumentation könnte für Erstanwender etwas verbessert werden, aber es war definitiv ausreichend.
Sam
Gibt es eine Möglichkeit, diese Bibliothek ohne einen benutzerdefinierten Typ zu verwenden, sodass ich einfach mein Tabellenraster (benutzerdefiniert) durchlaufen und den Header ausschreiben und dann jedes Zeilenfeld übergeben kann? Ich suche nur nach einer Möglichkeit, Fehler in den Dateien zu verhindern (ordnungsgemäßes Escaping usw.).
U84six
Ja. Sie können verwenden WriteField. Überprüfen Sie die Dokumente hier joshclose.github.io/CsvHelper
Josh Schließen
1
@ Zimano Nicht wahr. Sie können einzelne Felder lesen oder einfach nur ein String-Array für die Zeile abrufen. Lesen Sie die Dokumentation. joshclose.github.io/CsvHelper
Josh Close
@JoshClose Oh, das ist gut zu hören, danke! Ich habe nur die Anleitung für die ersten Schritte hier gelesen : joshclose.github.io/CsvHelper/… und sie enthielt nicht meinen Anwendungsfall. Ich hätte weiter schauen sollen, entschuldige mich. Auf dieser Seite heißt es jedoch, dass die Verwendung einer Zuordnung die empfohlene Methode ist CsvHelper. Vielleicht könnte es an dieser Stelle einige alternative Lesestrategien bieten? Ich habe meine ursprüngliche Bemerkung übrigens gelöscht, da sie jetzt irrelevant ist :-)
Zimano
21

Es gibt einige Optionen, direkt im Framework.

Am einfachsten ist es, auf Microsoft.VisualBasic zu verweisen und dann TextFieldParser zu verwenden . Es ist ein voll funktionsfähiger CSV-Reader im Kernframework.

Eine weitere gute Alternative ist die Verwendung von Datasets zum Lesen von CSV-Dateien .

Reed Copsey
quelle
6
Ich habe mich immer gefragt, warum es in der Microsoft.VisualBasic-Assembly enthalten ist ... Hat MS gedacht, dass C # -Entwickler CSV nicht verwenden?
Thomas Levesque
4
@Thomas: Zumal viele C # -Entwickler bei dem Gedanken
2
Ja - da sind viele nette "Goodies" drin. Ich denke, es liegt eher daran, dass VB einige Sprachkonstrukte hat, die ursprünglich nicht wirklich im Framework berücksichtigt wurden, aber sie hätten VB6-Benutzer niemals vermitteln können, ohne sie zu implementieren. Die Namespaces Devices und ApplicationServices enthalten alle möglichen nützlichen Funktionen.
Reed Copsey
20
@ Roboto, jeder C # -Entwickler, der in seinem Projekt auf Microsoft.VisualBasic verweist, ist ein ignoranter Sprach-Snob. Schlimmer noch, sie verstehen .NET überhaupt nicht.
Ash
3
Ein weiteres Juwel der VB-Assembly ist CopyDirectory: stackoverflow.com/questions/58744/…
17

Sebastien Lorion hat einen großartigen CSVLeser auf CodeProject namens A Fast CSV Reader . Wahrscheinlich eines der besten für C # und es ist kostenlos.

Verwenden Sie zum Schreiben einfach StreamWriter.

Hier ist ein Code zum Schreiben DataGridVieweiner Datei in eine Datei:

private void exportDGVToCSV(string filename)
{
    if (dataGridView1.Columns.Count != 0) 
    {    
        using (Stream stream = File.OpenWrite(filename))
        {
            stream.SetLength(0);
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // loop through each row of our DataGridView
                foreach (DataGridViewRow row in dataGridView1.Rows) 
                {
                    string line = string.Join(",", row.Cells.Select(x => $"{x}"));
                    writer.WriteLine(line);
                }

                writer.Flush();
            }
        };
    }
}
Matze
quelle
2
Das ist mein Favorit. Tolle kleine Bibliothek.
Alex
2
Das Schreiben von CSV ist einfach - verwenden Sie einfach eine normale Textausgabemethode und trennen Sie diese durch Kommas. Sie brauchen wirklich nur eine Bibliothek / einen benutzerdefinierten Handler zum Lesen ...
Reed Copsey
10
@Reed: Es ist nicht zu trivial, wenn Kommas und Anführungszeichen korrekt maskiert werden sollen. Ich bin mir nicht einmal sicher, ob es dafür eine Standardisierung gibt, aber es ist sehr üblich, dies zu tun.
Stefan Steinegger
26
Das Schreiben von CSV ist etwas komplexer. Wenn die Daten, die in der CSV-Datei ausgedrückt werden sollen, Kommas oder neue Zeilen enthalten, müssen Sie die Daten mit Anführungszeichen umgeben. Wenn die neu mit Anführungszeichen versehenen Daten ein Anführungszeichen enthalten, müssen Sie das Anführungszeichen mit doppelten Anführungszeichen umgehen. Sie könnten diese Logik sicherlich selbst codieren, aber es wäre schön, wenn eine Bibliothek dies für Sie tun würde.
Tinister
4
Die Standardisierung ist RFC 4180. tools.ietf.org/html/rfc4180
Josh Close
7

Ja - obwohl ich davon ausgehe, dass Sie tatsächlich nach Einzelheiten fragen?

Versuchen Sie FileHelpers

Murph
quelle
Nun, ich habe es getan, aber aus irgendeinem seltsamen Grund sind FileHelpers zufällig zusammengebrochen. Darüber hinaus befindet sich die FileHelpers-Bibliothek schon lange nicht mehr in der Entwicklung.
Erik Schierboom
1
FileHelpers werden jetzt aktiv entwickelt, siehe GitHub .
Xmedeko
3

Es gibt Dutzende.

http://www.filehelpers.net/ ist eine der häufigsten.

Ich sollte sagen, dass ich Filehelpers in einigen Szenarien als einschränkend empfinde und stattdessen den Fast CSV Reader verwende . Wenn Sie nach meiner Erfahrung das Format Ihrer CSV-Datei oder die Importzuordnung erst zur Laufzeit kennen, ist dies die bessere Bibliothek.

Alex
quelle
Wir verwenden auch Filehelper.
Tangurena
1
Ich habe festgestellt, dass FileHelpers ein Ärgernis beim Konfigurieren ist. FastCsvReader war viel einfacher zu bedienen.
Josh Close
+1 für FastCsvReader. Hervorragende Leistung. Aber es ist hauptsächlich ein Leser / Parser. Kein Schriftsteller.
Mehdi LAMRANI