LINQ to XML -  Convertendo um arquivo CSV para o formato XML

 Neste artigo vamos mostrar como converter um arquivo CSV(Comma Separated Value) em um arquivo XML bem formatado usando os recursos do LINQ to XML.

O que é um arquivo CSV ?

Um arquivo CSV (Comma Separated Value) é um formato de arquivo que é normalmente usado para troca de dados entre aplicações diferentes. O arquivo no formato CSV possui os dados delimitados onde os campos são separados pelo caractere vírgula e registros separados por uma nova linha. Este formato de arquivo é usado no Microsoft Excel ,e tornou-se um pseudo padrão para a indústria mesmo entre plataformas não Microsoft.

Embora não exista uma especificação formal para o formato CSV, a RFC 4180 descreve um formato comum e estabelece o tipo MIME "text/csv" .

Um arquivo CSV é um arquivo texto delimitado que utiliza a vírgula para separar os valores existentes no arquivo, sendo que existem implementações onde outros separadores também podem ser usados.

Os arquivos CSV mais simples não permitem valores que contém vírgula (Ex: Rua Teste, 100) ou outros caracteres especiais como o indicador de nova linha CR ou LF. (Carriage Return/ Line Feed) . Implementações mais sofisticadas permitem vírgulas, ponto e vírgula(;), asterístico(*) como delimitadores e outros caracteres especiais.

Gerar arquivos CSV é muito simples e envolve conceitos básicos mas importantes que todo o desenvolvedor .NET deve conhecer.

Para o exemplo usado neste artigo a primeira linha do arquivo CSV deverá conter o nome dos campos do arquivo.

A seguir temos um exemplo do arquivo Clientes_CSV.txt no formato que iremos tratar para gerar o arquivo XML.

Nome, Sobrenome, Email, Cidade, Telefone
Joao, Silva, joaosilva@uol.com.br, Curitiba, 11-98504000 
Janice, Santaos, jansantos@bol.com.br, Niteroi,21-85202010
Jessica, Alba, jessalba@yahoo.com,  Brasilia, 61-7850-6050
Marcia, Almeida, marciaalm@uol.com.br, Santos, 11-9874-6040
Paulo, Soares, paulosoares@net.com, Osasco, 11-9840-7080
Amanda, Rodrigues, amanrodrig@ig.com.br, Caxias, 81-5805-6012

Ao arquivo acima irá gerar o arquivo XML no seguinte formato:

Ferramentas usadas:

Criando o projeto no Visual Studio 2013 Express

Abra o VS 2013 for Windows desktop e clique em New Project;

Selecione a linguagem Visual C# e o template Windows Forms Application e informe o nome CSharp_CSV_XML;

No formulário form1.cs inclua os seguintes controles a parti da ToolBox:

O leiaute do formulário deverá ficar como o da figura abaixo:

Agora clique no menu PROJECT e a seguir em Add Class;

Selecione o template Class,  informe o nome ConversorCSV_XML.cs e clique no botão Add:

A seguir vamos definir os namespaces necessários ao nosso projeto:

using System;
using System.Xml.Linq;

Após isso digite o código abaixo para a classe ConversorCSV_XML.cs :

   public static XDocument Converte_CSV_Para_XML(string csvString, string[] separadorCampo)
        {
            //separa as linhas do arquivo CSV
            var sep = new[] { "\r\n" };
            string[] linhas = csvString.Split(sep, StringSplitOptions.RemoveEmptyEntries);
            //Cria uma declaração XML
            var xsurvey = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"));
            //Cria o elemento raiz do XML
            var xroot = new XElement("root"); 
            //percorre cada linha do arquivo CSV
            for (int i = 0; i < linhas.Length; i++)
            {
                //Cria cada linha
                if (i > 0)
                {
                    xroot.Add(gera_Linha_XML(linhas[i], linhas[0], separadorCampo));
                }
            }
            xsurvey.Add(xroot);
            return xsurvey;
        }

 

A seguir clique novamente no menu PROJECT e a seguir em Add Class;

Selecione o template Class,  informe o nome gera_Linha_XML.cs e clique no botão Add:

Em seguida digite o código abaixo para esta classe:

  private static XElement gera_Linha_XML(string linha,string primeiraLinha, string[] separadorCampo)
 {
            //separa os campos da linha do arquivo CSV
            string[] temp = linha.Split(separadorCampo, StringSplitOptions.None);
            //separa o nome dos campos da primeira linha do arquivo CSV
            string[] nomes = primeiraLinha.Split(separadorCampo, StringSplitOptions.None);
            //cria um novo elemento row
            var xmlLinha = new XElement("row");
            for (int i = 0; i < temp.Length; i++)
            {
                //Cria o elemento var e os atributos com o nome do campo e valor
                var xvar = new XElement("var",
                                        new XAttribute("name", nomes[i]),
                                        new XAttribute("value", temp[i]));
                xmlLinha.Add(xvar);
            }
            return xmlLinha;
  }

No evento Click do botão - Converter CSV para XML - inclua o código abaixo :

 private void btnConverter_Click(object sender, EventArgs e)
 {
        try
        {
                //le o conteúdo do arquivo texto 
                string arquivo_CSV = File.ReadAllText(txtArquivoCSV.Text);
                //chama o método para converter o CSV para XML e gera um XDocument
                XDocument docXML = ConversorCSV_XML.Converte_CSV_Para_XML(arquivo_CSV, new[] { "," });
                //Salva o arquivo XML
                docXML.Save(@"c:\dados\Clientes_CSV.xml");
                //escreve a primeira linha do XML no textBox
                txtXML.Text = docXML.Declaration.ToString();
                //escreve cada linha do XML no TextBox
                foreach (XElement c in docXML.Elements())
                {
                    txtXML.Text += c.ToString();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
       }

Executando o projeto vemos abaixo um exemplo de resultado obtido para a conversão de um arquivo CSV para XML :

Pegue o projeto completo aqui :  CSharp_CSV_XML.zip

Joã 3:35 O Pai ama ao Filho, e todas as coisas entregou nas suas mãos.

Joã 3:36 Quem crê no Filho tem a vida eterna; o que, porém, desobedece ao Filho não verá a vida, mas sobre ele permanece a ira de Deus.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti