Trabalhando com CSV em C# (.NET): visão geral das ferramentas e exemplos
CSV (Comma-Separated Values) é um dos formatos mais comuns para troca de dados tabulares. No ecossistema C# (.NET), existem várias maneiras confiáveis de trabalhar com este formato: desde ferramentas integradas até poderosas bibliotecas de terceiros. Neste artigo, abordaremos as principais abordagens e melhores práticas.
Por que não escrever um parser CSV manualmente?
O formato CSV parece simples à primeira vista, mas na prática contém muitas nuances: escape de aspas, vírgulas dentro dos campos, diferentes delimitadores, caracteres de nova linha em valores. Usar bibliotecas prontas elimina dores de cabeça e o tratamento de casos extremos.
Biblioteca CsvHelper — o padrão ouro
CsvHelper é a biblioteca mais popular para trabalhar com CSV em .NET. Ela suporta mapeamento para classes POCO, leitura em streaming, configuração de delimitadores e codificações.
Instalação via NuGet:
Install-Package CsvHelperExemplo de leitura de CSV para uma 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();}Exemplo de escrita de CSV a partir de uma coleção
using (var writer = new StreamWriter("output.csv"))using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)){ csv.WriteRecords(users);}Parser integrado: TextFieldParser (Microsoft.VisualBasic)
Se você não quiser adicionar dependências externas, o .NET possui o TextFieldParser integrado do namespace Microsoft.VisualBasic.FileIO. Ele está disponível no .NET Framework e .NET Core/.NET 5+ (requer instalação do pacote Microsoft.VisualBasic).
Exemplo de uso do 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)); }}Prós: não requer bibliotecas de terceiros. Contras: menos flexível que o CsvHelper, sem mapeamento automático para classes.
Trabalhando com arquivos grandes: processamento em streaming
Ao trabalhar com arquivos CSV com mais de 100 MB, é importante evitar carregar todo o arquivo na memória. Ambas as bibliotecas suportam processamento em streaming:
- CsvHelper — use
GetRecords<T>()em um loopforeachsem chamar.ToList(). - TextFieldParser — lê linha por linha, o que também é eficiente.
Exemplo de leitura em streaming com 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); // processa um por um }}Tratamento de erros e validação de dados
Ao importar CSV, os dados podem estar incorretos. O CsvHelper permite configurar o tratamento de erros através de eventos:
csv.Configuration.BadDataFound = context =>{ Console.WriteLine($"Erro na linha {context.RawRow}: {context.RawRecord}");};Também é possível usar atributos para validação de campos:
public class Product{ [Name("ProductId")] public int Id { get; set; } [Required] public string Nam Também na biblioteca
Express.js para JavaScript (Node.js): guia completo com exemplos
Sharp para JavaScript (Node.js): guia completo com exemplos
Geração de PDF em PHP: bibliotecas, ferramentas e exemplos de código