Arbeiten mit CSV in C# (.NET): Überblick über Werkzeuge und Beispiele
CSV (Comma-Separated Values) ist eines der am weitesten verbreiteten Formate für den Austausch von Tabellendaten. Im C# (.NET)-Ökosystem gibt es mehrere zuverlässige Methoden zur Arbeit mit diesem Format: von integrierten Mitteln bis hin zu leistungsstarken Drittanbieter-Bibliotheken. In diesem Artikel betrachten wir die grundlegenden Ansätze und bewährten Verfahren.
Warum man keinen CSV-Parser selbst schreiben sollte?
Das CSV-Format erscheint auf den ersten Blick einfach, enthält aber in der Praxis viele Nuancen: Maskierung von Anführungszeichen, Kommas innerhalb von Feldern, unterschiedliche Trennzeichen, Zeilenumbrüche in Werten. Die Verwendung fertiger Bibliotheken erspart Kopfschmerzen und die Behandlung von Randfällen.
Die Bibliothek CsvHelper – der Goldstandard
CsvHelper ist die beliebteste Bibliothek für die Arbeit mit CSV in .NET. Sie unterstützt das Mapping auf POCO-Klassen, Streaming-Lesen, Konfiguration von Trennzeichen und Kodierungen.
Installation über NuGet:
Install-Package CsvHelperBeispiel: CSV in eine Liste von Objekten lesen
using CsvHelper;using System.Globalization;
public class User{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; }}
var users = new List<User>();using (var reader = new StreamReader("users.csv"))using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)){ users = csv.GetRecords<User>().ToList();}Beispiel: CSV aus einer Sammlung schreiben
using (var writer = new StreamWriter("output.csv"))using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)){ csv.WriteRecords(users);}Integrierter Parser: TextFieldParser (Microsoft.VisualBasic)
Wenn Sie keine externen Abhängigkeiten einbinden möchten, bietet .NET den integrierten TextFieldParser aus dem Namensraum Microsoft.VisualBasic.FileIO. Er ist in .NET Framework und .NET Core/.NET 5+ verfügbar (erfordert die Installation des Pakets Microsoft.VisualBasic).
Beispiel zur Verwendung von TextFieldParser
using Microsoft.VisualBasic.FileIO;
using (var parser = new TextFieldParser("data.csv")){ parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData) { string[] fields = parser.ReadFields(); Console.WriteLine(string.Join(" | ", fields)); }}Vorteile: Keine Drittanbieter-Bibliotheken erforderlich. Nachteile: Weniger flexibel als CsvHelper, kein automatisches Mapping auf Klassen.
Arbeiten mit großen Dateien: Stream-Verarbeitung
Bei der Arbeit mit CSV-Dateien größer als 100 MB ist es wichtig, das Laden der gesamten Datei in den Arbeitsspeicher zu vermeiden. Beide Bibliotheken unterstützen die Stream-Verarbeitung:
- CsvHelper – Verwenden Sie
GetRecords<T>()in einerforeach-Schleife ohne Aufruf von.ToList(). - TextFieldParser – Liest Zeile für Zeile, was ebenfalls effizient ist.
Beispiel für Streaming-Lesen mit CsvHelper
using (var reader = new StreamReader("large.csv"))using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)){ foreach (var record in csv.GetRecords<User>()) { ProcessUser(record); // einzeln verarbeiten }}Fehlerbehandlung und Datenvalidierung
Beim Import von CSV können die Daten fehlerhaft sein. CsvHelper ermöglicht die Konfiguration der Fehlerbehandlung über Ereignisse:
csv.Configuration.BadDataFound = context =>{ Console.WriteLine($"Fehler in Zeile {context.RawRow}: {context.RawRecord}");};Es können auch Attribute zur Feldvalidierung verwendet werden:
public class Product{ [Name("ProductId")] public int Id { get; set; } [Required] public string Nam Auch in der Bibliothek
Autorisierung und Authentifizierung in Swift (iOS/macOS): vollständige Anleitung
Event Bus und Observer-Pattern in PHP: Implementierung und Beispiele
TypeBox für TypeScript: Komplettguide mit Praxisbeispielen