Travailler avec CSV en C# (.NET) : aperçu des outils et exemples
CSV (Comma-Separated Values) est l'un des formats les plus courants pour l'échange de données tabulaires. Dans l'écosystème C# (.NET), il existe plusieurs méthodes fiables pour travailler avec ce format : des outils intégrés aux puissantes bibliothèques tierces. Dans cet article, nous examinerons les approches principales et les meilleures pratiques.
Pourquoi ne pas écrire un analyseur CSV manuellement ?
Le format CSV semble simple à première vue, mais en pratique, il comporte de nombreuses subtilités : échappement des guillemets, virgules à l'intérieur des champs, différents séparateurs, caractères de nouvelle ligne dans les valeurs. L'utilisation de bibliothèques prêtes à l'emploi vous évite des maux de tête et le traitement des cas limites.
La bibliothèque CsvHelper — l'étalon-or
CsvHelper est la bibliothèque la plus populaire pour travailler avec CSV en .NET. Elle prend en charge le mappage vers des classes POCO, la lecture en flux, la configuration des séparateurs et des encodages.
Installation via NuGet :
Install-Package CsvHelperExemple de lecture CSV dans une liste d'objets
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();}Exemple d'écriture CSV à partir d'une collection
using (var writer = new StreamWriter("output.csv"))using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)){ csv.WriteRecords(users);}Analyseur intégré : TextFieldParser (Microsoft.VisualBasic)
Si vous ne souhaitez pas ajouter de dépendances externes, .NET dispose d'un analyseur intégré TextFieldParser de l'espace de noms Microsoft.VisualBasic.FileIO. Il est disponible dans .NET Framework et .NET Core/.NET 5+ (nécessite l'installation du package Microsoft.VisualBasic).
Exemple d'utilisation de 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)); }}Avantages : ne nécessite pas de bibliothèques tierces. Inconvénients : moins flexible que CsvHelper, pas de mappage automatique vers les classes.
Travailler avec de gros fichiers : traitement en flux
Lorsque vous travaillez avec des fichiers CSV de plus de 100 Mo, il est important d'éviter de charger tout le fichier en mémoire. Les deux bibliothèques prennent en charge le traitement en flux :
- CsvHelper — utilisez
GetRecords<T>()dans une boucleforeachsans appeler.ToList(). - TextFieldParser — lit ligne par ligne, ce qui est également efficace.
Exemple de lecture en flux avec 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); // traite un par un }}Gestion des erreurs et validation des données
Lors de l'importation CSV, les données peuvent être incorrectes. CsvHelper permet de configurer la gestion des erreurs via des événements :
csv.Configuration.BadDataFound = context =>{ Console.WriteLine($"Erreur à la ligne {context.RawRow} : {context.RawRecord}");};Vous pouvez également utiliser des attributs pour la validation des champs :
public class Product{ [Name("ProductId")] public int Id { get; set; } [Required] public string Nam