Resumo : neste tutorial, você aprenderá como usar arquivos CSV de leitura em C# usando a biblioteca CsvHelper.
Introdução à biblioteca CSVhelper
CsvHelper é uma biblioteca popular de código aberto para leitura e gravação de arquivos CSV (Comma Separated Value) em C#.
CSVHelper é rápido, flexível e fácil de usar. Ele fornece recursos para personalizar o processo de análise e gravação de CSV. Por exemplo, ele pode mapear colunas CSV para propriedades de objetos, especificar delimitadores e aspas personalizados e lidar com conversões de tipo e erros.
A biblioteca CsvHelper está disponível como um pacote NuGet. Portanto, você precisa instalá-lo por meio da linha de comando ou usando o NuGet Package Manager do Visual Studio.
Instalando o CsvHelper
A seguir mostramos como instalar a biblioteca CsvHelper usando o console do gerenciador de pacotes, o console .Net CLI e o Visual Studio:
Console do gerenciador de pacotes
Install-Package CsvHelper
Console CLI do .NET
dotnet add package CsvHelper
Estúdio visual
Se você usa o Visual Studio, poderá seguir estas etapas:
Primeiro, clique com o botão direito Dependencies
e selecione o Manager NuGet Packages...
item de menu:
Em segundo lugar, digite CsvHelper, escolha o pacote conforme mostrado na imagem a seguir e clique no botão Instalar :
Preparando um arquivo CSV de amostra para leitura
Baixe o seguinte arquivo data.csv e copie-o para o diretório do projeto. Para permitir que o programa leia o arquivo CSV, você precisa alterar sua configuração para que o Visual Studio o copie para o diretório de saída:
Lendo um arquivo CSV em uma coleção de objetos dinâmicos
O programa a seguir lê o arquivo data.csv e converte linhas CSV em objetos dinâmicos:
using CsvHelper;
using System.Globalization;
using static System.Console;
using var reader = new StreamReader("data.csv");
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
// read CSV file
var records = csv.GetRecords<dynamic>();
// output
foreach (var r in records)
{
WriteLine($"{r.FirstName,-15}{r.LastName,-10}{r.JoinedDate,15}{r.Salary,15}{r.Active,5}");
}
Linguagem de código: PHP ( php )
Saída:
John Smith 2/1/2023 245,941.00 Yes
Sarah Johnson 3/1/2023 208,902.00 Yes
Michael Brown 3/1/2023 215,970.00 Yes
Emily Davis 2/1/2023 239,648.00 Yes
David Wilson 3/1/2023 190,999.00 Yes
Jennifer Martinez 2/1/2023 132,277.00 Yes
Robert Garcia 2/1/2023 157,395.00 Yes
Jessica Lee 2/1/2023 210,666.00 Yes
Christopher Rodriguez 2/1/2023 83,272.00 Yes
Amanda Taylor 2/1/2023 143,537.00 Yes
Como funciona.
Primeiro, crie um StreamReader
objeto para ler o conteúdo dos dados do arquivo CSV:
using var reader = new StreamReader("data.csv");
Linguagem de código: JavaScript ( javascript )
A using
declaração garante que o StreamReader
objeto seja descartado corretamente.
Segundo, crie um novo CsvHelper
objeto com o StreamReader
objeto e CultureInfo.InvariantCulture
. O CultureInfo.InvariantCulture
objeto especifica as configurações de cultura do arquivo CSV.
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
Linguagem de código: JavaScript ( javascript )
Terceiro, leia o arquivo CSV usando o GetRecords<dynamic>
método que retorna um arquivo IEnumerable<dynamic>
. Cada objeto IEnumerable<dynamic>
representa uma linha no arquivo CSV:
var records = csv.GetRecords<dynamic>();
Linguagem de código: HTML, XML ( xml )
Por fim, grave cada linha do arquivo CSV no console usando um foreach
loop. Observe que usamos os especificadores de formato ,-15
, ,-10
, ,15
, ,15
e ,5
para formatar a saída com preenchimento e alinhamento apropriados:
foreach (var r in records)
{
WriteLine($"{r.FirstName,-15}{r.LastName,-10}{r.JoinedDate,15}{r.Salary,15}{r.Active,5}");
}
Linguagem de código: PHP ( php )
Lendo um arquivo CSV em uma coleção de objetos específicos
O seguinte lê o data.csv
arquivo e converte cada linha em um Employee
objeto:
using CsvHelper;
using System.Globalization;
using static System.Console;
class Employee
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
public DateOnly? JoinedDate { get; set; }
public decimal? Salary { get; set; }
public string? Active { get; set; }
}
class Program
{
static void Main(string[] args)
{
using var reader = new StreamReader("data.csv");
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
// Read CSV file
var employees = csv.GetRecords<Employee>();
// Output
foreach (var e in employees)
{
WriteLine($"{e.FirstName,-15}{e.LastName,-10}{e.JoinedDate,15}{e.Salary,15}{e.Active,5}");
}
}
}
Linguagem de código: JavaScript ( javascript )
Como funciona.
Primeiro, defina a Employee
classe com os campos FirstName
, LastName
, JoinedDate
, Salary
e Active
. Cada campo corresponde a uma coluna do data.csv
arquivo:
class Employee
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
public DateOnly? JoinedDate { get; set; }
public Decimal? Salary { get; set; }
public String? Active { get; set; }
}
Linguagem de código: JavaScript ( javascript )
Segundo, leia o data.csv
arquivo e mapeie cada linha para um Employee
objeto no Main()
método da Program
classe:
class Program
{
static void Main(string[] args)
{
using var reader = new StreamReader("data.csv");
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
// Read CSV file
var employees = csv.GetRecords<Employee>();
// Output
foreach (var e in employees)
{
WriteLine($"{e.FirstName,-15}{e.LastName,-10}{e.JoinedDate,15}{e.Salary,15}{e.Active,5}");
}
}
}
Linguagem de código: JavaScript ( javascript )
Neste programa, passamos a Employee
classe para ao GetRecords<Employee>
invés de dynamic
.
Lendo um arquivo CSV sem cabeçalho
Se você excluir o cabeçalho do data.csv
arquivo e executar o programa acima, receberá uma exceção. Para evitar o erro, você precisa criar um CsvConfiguration
objeto e passá-lo para a CsvHelper
classe:
using CsvHelper;
using CsvHelper.Configuration;
using System.Globalization;
using static System.Console;
class Employee
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
public DateOnly? JoinedDate { get; set; }
public Decimal? Salary { get; set; }
public String? Active { get; set; }
}
class Program
{
static void Main(string[] args)
{
using var reader = new StreamReader("data.csv");
var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false
};
using var csv = new CsvReader(reader, csvConfig);
// Read CSV file
var employees = csv.GetRecords<Employee>();
// Output
foreach (var e in employees)
{
WriteLine($"{e.FirstName,-15}{e.LastName,-10}{e.JoinedDate,15}{e.Salary,15}{e.Active,5}");
}
}
}
Linguagem de código: JavaScript ( javascript )
Lendo um arquivo CSV com espaços no cabeçalho
Se o cabeçalho do arquivo CSV tiver espaços, por exemplo , First Name
em vez de FirstName
, será necessário pré-processá-lo antes de ler o arquivo.
Para fazer isso você pode usar PrepareHeaderForMatch
a opção do CsvConfiguration
objeto. Por exemplo, você pode remover os espaços como no exemplo a seguir:
using CsvHelper;
using CsvHelper.Configuration;
using System.Globalization;
using static System.Console;
class Employee
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
public DateOnly? JoinedDate { get; set; }
public decimal? Salary { get; set; }
public string? Active { get; set; }
}
class Program
{
static void Main(string[] args)
{
using var reader = new StreamReader("data.csv");
var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
PrepareHeaderForMatch = args => args.Header.Replace(" ", string.Empty)
};
using var csv = new CsvReader(reader, csvConfig);
// Read CSV file
var employees = csv.GetRecords<Employee>();
// Output
foreach (var e in employees)
{
WriteLine($"{e.FirstName,-15}{e.LastName,-10}{e.JoinedDate,15}{e.Salary,15}{e.Active,5}");
}
}
}
Linguagem de código: JavaScript ( javascript )
Neste programa, configuramos a PrepareHeaderForMatch
opção no CsvConfiguration
objeto. Atribuímos uma expressão lambda à PrepareHeaderForMatch
propriedade.
A expressão lambda aceita um PrepareHeaderForMatchArgs
objeto e substitui os espaços no cabeçalho CSV.
var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
PrepareHeaderForMatch = args => args.Header.Replace(" ", string.Empty)
};
Linguagem de código: JavaScript ( javascript )
Resumo
- Use o pacote CsvHelper para ler arquivos CSV.
- Use o
CsvConfiguration
objeto para personalizar a forma como o CsvHelper analisa os arquivos CSV.