C# Ler arquivo CSV

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 Dependenciese 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 StreamReaderobjeto para ler o conteúdo dos dados do arquivo CSV:

using var reader = new StreamReader("data.csv");Linguagem de código:  JavaScript  ( javascript )

A usingdeclaração garante que o StreamReaderobjeto seja descartado corretamente.

Segundo, crie um novo CsvHelperobjeto com o StreamReaderobjeto e CultureInfo.InvariantCulture. O CultureInfo.InvariantCultureobjeto 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 foreachloop. Observe que usamos os especificadores de formato ,-15, ,-10, ,15, ,15e ,5para 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.csvarquivo e converte cada linha em um Employeeobjeto:

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 Employeeclasse com os campos FirstName, LastName, JoinedDate, Salarye Active. Cada campo corresponde a uma coluna do data.csvarquivo:

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.csvarquivo e mapeie cada linha para um Employeeobjeto no Main()método da Programclasse:

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 Employeeclasse para ao GetRecords<Employee>invés de dynamic.

Lendo um arquivo CSV sem cabeçalho

Se você excluir o cabeçalho do data.csvarquivo e executar o programa acima, receberá uma exceção. Para evitar o erro, você precisa criar um CsvConfigurationobjeto e passá-lo para a CsvHelperclasse:

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 Nameem vez de FirstName, será necessário pré-processá-lo antes de ler o arquivo.

Para fazer isso você pode usar PrepareHeaderForMatcha opção do CsvConfigurationobjeto. 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 PrepareHeaderForMatchopção no CsvConfigurationobjeto. Atribuímos uma expressão lambda à PrepareHeaderForMatchpropriedade.

A expressão lambda aceita um PrepareHeaderForMatchArgsobjeto 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 CsvConfigurationobjeto para personalizar a forma como o CsvHelper analisa os arquivos CSV.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *