Trabajo con CSV en C# (.NET): resumen de herramientas y ejemplos
CSV (Comma-Separated Values) es uno de los formatos más comunes para el intercambio de datos tabulares. En el ecosistema de C# (.NET) existen varias formas fiables de trabajar con este formato: desde herramientas integradas hasta potentes bibliotecas de terceros. En este artículo, revisaremos los enfoques principales y las mejores prácticas.
¿Por qué no deberías escribir un analizador CSV manualmente?
El formato CSV parece simple a primera vista, pero en la práctica contiene muchos matices: escape de comillas, comas dentro de los campos, diferentes delimitadores, caracteres de nueva línea en los valores. El uso de bibliotecas preparadas elimina dolores de cabeza y el manejo de casos extremos.
Biblioteca CsvHelper: el estándar de oro
CsvHelper es la biblioteca más popular para trabajar con CSV en .NET. Admite mapeo a clases POCO, lectura en streaming, configuración de delimitadores y codificaciones.
Instalación a través de NuGet:
Install-Package CsvHelperEjemplo de lectura de CSV a una lista de objetos
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();}Ejemplo de escritura de CSV desde una colección
using (var writer = new StreamWriter("output.csv"))using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)){ csv.WriteRecords(users);}Analizador integrado: TextFieldParser (Microsoft.VisualBasic)
Si no deseas agregar dependencias externas, en .NET existe el TextFieldParser integrado del espacio de nombres Microsoft.VisualBasic.FileIO. Está disponible en .NET Framework y .NET Core/.NET 5+ (requiere instalar el paquete Microsoft.VisualBasic).
Ejemplo de uso 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)); }}Ventajas: no requiere bibliotecas de terceros. Desventajas: menos flexible que CsvHelper, no tiene mapeo automático a clases.
Trabajo con archivos grandes: procesamiento en streaming
Al trabajar con archivos CSV de más de 100 MB, es importante evitar cargar todo el archivo en memoria. Ambas bibliotecas admiten procesamiento en streaming:
- CsvHelper — usa
GetRecords<T>()en un bucleforeachsin llamar a.ToList(). - TextFieldParser — lee línea por línea, lo que también es eficiente.
Ejemplo de lectura en streaming con 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); // procesamos uno por uno }}Manejo de errores y validación de datos
Al importar CSV, los datos pueden ser incorrectos. CsvHelper permite configurar el manejo de errores mediante eventos:
csv.Configuration.BadDataFound = context =>{ Console.WriteLine($"Error en la línea {context.RawRow}: {context.RawRecord}");};También se pueden usar atributos para la validación de campos:
public class Product{ [Name("ProductId")] public int Id { get; set; } [Required] public string Nam