Olá pessoal, meu nome é Mauricio Junior e hoje eu vou mostrar como converter um arquivo CSV para Json usando apenas duas linhas de código. Por várias vezes o meu chefe me pediu para pegar os dados de uma planilha Excel e colocar no database.

Utilizado

  • Ferramenta: Visual Studio
  • Linguagem de programação: C# (sharp)
  • Pacote: NuGet
  • Tipo de exemplo: Console application
  • Framework: .NET Core

Eu criei um aplicação do tipo console no primeiro passo e já comecei com o código. Vamos para prática. Lembro que este artigo foi criado para que você faça junto comigo, usando o passo a passo.

Depois de abrir o projeto, cliquei com o botão direito em cima da pasta de referência e cliquei na opção Manage NuGet Packages. Veja a figura 1.

Image

Figura 1 - Abrindo o pacote NuGet

Depois disso procurei o pacote chamado ConvertCsvToJson criado por mim mesmo e disponibilizado na loja de pacotes da Microsoft chamado NuGet.org. Veja a figura 2.

image

Figura 2 - Adicionando o NuGet na aplicação

Cliquei no botão Add Package para que já apareça em meu projeto.

Problema

O meu gerente pediu para pegar os dados de uma planilha em Excel para salvar no database específico que a empresa tem. Esse tipo de coisa acontece a todo tempo em grandes e pequenas empresas. Pessoas usam muito a planilha em Excel para fazer listas, gerar gráficos e tudo mais. A planilha que ele me passou tem essas informações aqui. Veja a figura 3.

Image

Figura 3 - Planilha de Excel

Eu notei os seguintes campos: Name, Email, Salary e Type. Os campos estão em inglês mas isso não é problema. Depois disso tem os valores de cada campo. O primeiro ponto aqui foi converter o Excel em arquivo CSV que é bem simples, bastou eu abrir o Excel e salvar como CSV. Veja a figura 4.

Image

Figura 4 - Convertendo Excel para CSV

Eu cliquei para salvar como e depois escolhi a opção CSV como está na figura 4.

Agora com o CSV em mãos, basta usar o componente que eu mesmo criei e disponibilizei grátis na Microsoft. Se você quiser ver mais componentes grátis que eu criei acesse www.mauriciojunior.net/nugets.

Codificando

Em duas linhas de código o sistema vai pegar todos os dados pra mim e depois eu posso trabalhar com eles de uma maneira simples e tranquila dentro da programação. Veja o código 1.

using ConvertCsvToJson;

namespace ConvertExcelToJson
{
    class Program
    {
        static void Main(string[] args)
        {
            var main = new Main();
            var result = ((IMain)main).ConvertCsvFileToJsonObject("Users.csv");

            Console.WriteLine(result);
            Console.ReadLine();
        }
    }
}

Código 1 - Usando o pacote ConvertCsvToJson

O primeiro ponto aqui foi fazer os importes necessários como o ConvertCsvToJson. Depois disso eu fiz a primeira instância usando a variável main var main = new Main(). Depois disso e na segunda linha eu usei a interface para chamar o método e o resultado eu enviei para outra variável chamada result, var result = ((IMain)main).ConvertCsvFileToJsonObject("User.csv") passando a minha planilha convertida para csv.

O resultado dessas duas linhasa foi uma lista com todos os valores do tipo string. Eu só mandei escrever na tela o resultado com os valores em string.

Com essas duas linhas de código tudo ficou bem simples para separar os dados e trabalhar com eles para gravar no banco de dados, mas isso ainda não resolveu todos os meus problemas. Agora eu preciso pegar os dados e separar de acordo com cada campo.

O meu resultado das duas linhas de código foi a string retornada com todos os valores lá. A figura 5 mostra esse dado quando eu analisei passo a passo no sistema, fazendo o debug.

Image

Figura 5 - Dados pegos do arquivo CSV

O código 2 mostra como fazer isso depois de pegar o resultado. O que eu preciso agora é gerar uma nova classe com todas as propriedades e o código já vai separar os dados de forma automática em cada campo como uma lista.

Cliquei com o botão direito e gerei uma nova classe chamada UserModel.cs

namespace ConvertExcelToJson
{
    public class UserModel
    {
        public string Name { get; set; }

        public string Age { get; set; }

        public string Email { get; set; }

        public string Salary { get; set; }

        public string Type { get; set; }

    }
}

Código 2 - Criando uma classe com as propriedades

Lembro que para gerar essas propriedades existe a linha de comando prop e depois basta clicar a tecla TAB duas vezes para que possa apenas digitar. Depois de criado a classe de modelo, quero fazer com que o meu resultado esteja em uma lista e cada valor esteja relacionado ao seu campo de forma correta, para isso eu vou fazer o código 3, ou seja, vou adicionar algumas coisas que não fiz anteriormente.

using ConvertCsvToJson;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;

namespace ConvertExcelToJson
{
    class Program
    {
        static void Main(string[] args)
        {
            var main = new Main();

            var result = ((IMain)main).ConvertCsvFileToJsonObject("Users.csv");

            var user = JsonConvert.DeserializeObject<IList<UserModel>>(result);

            Console.WriteLine(user[0].Name);

            Console.ReadLine();
        }
    }
}

Código 3 - Colocando os valores nas propriedades

O primeiro de mudança foi acrescentar os importes using Newtonsoft.Json e System.Collections.Generic porque eu vou usar a interface IList e vou usar o DeserializedObject.

A linha 3 do método Main onde eu criei a variável user faz toda a mágica. Eu peguei o resultado da variável result e coloquei dentro do método DeserializedObject<IList> e o resultado foi que todos os valores separados estão agora classificados e podem ser pegos apenas com o nome da propriedade.

No final, bastou colocar user[0].Name para pegar o nome da primeira lista de valores isso porque agora a variável virou uma lista de valores com posições dinâmica, ou seja, de acordo com o que tiver dentro do arquivo csv será criado, não importa a quantidade.

A figura 6 mostra como ficou separado cada valor pego do arquivo csv.

Image

Figura 6 - Resultado final.

Eu fico por aqui e espero que tenha gostado. Qualquer dúvida, pode entrar em contato comigo pela rede social Instagram em @mauriciojunior_net ou pelo meu site mauriciojunior.net.