LINQ-  Mesclando dois arquivos distintos e agrupando dados (VB. NET)


 Neste artigo eu vou mostrar como podemos mesclar arquivos distintos e criar um novo arquivo agrupando e organizando os dados em uma aplicação Windows Forms usando a linguagem VB .NET.

Neste artigo vamos recordar como usar os recursos da LINQ para mesclar dados de diferentes fontes criando um novo conjunto de arquivos que organizam os dados de uma nova forma.

O cenário é o seguinte :

Temos dois arquivos texto no formato CSV, onde o delimitador é a vírgula, e onde estão armazenados os nomes de alguns alunos:

Assim, o arquivo alunos1.csv possui os seguintes dados:

Bankov, Pedro
Holm, Miguel
Garcia, Hugo
Pinto, Cristina
Noriega, Fabricio
Aw, Kam Foo
Beebe, Ana
Toyoshima, Teodoro
Guy, Wey Yuan
Garcia, Debora
Dorneles, Jose
alunos1.csv

Temos também o arquivo alunos2.csv que possui os seguintes dados:

Liu, Jinghao
Bankov, Pedro
Holm, Miguel
Garcia, Hugo
Beebe, Ana
Gilchrist, Bianca
Myrcha, Jacek
Giakoumakis, Leo
McLin, Nkenge
El Yassir, Mehdi
Costa, Amanda
alunos2.csv

Nosso objetivo é ler o conteúdo desses arquivos e realizar uma consulta LINQ que mescle essas informações criando vários arquivos e organizando e agrupando as informações em ordem alfabética.

Criando o projeto no Visual Studio Community

Vamos criar uma solução usando o Visual Studio Community 2015 do tipo Windows Forms Application usando a linguagem C# com o nome Linq_Agrupar.

No formulário form1.vb da solução criada vamos usar 3 ListBox e 3 Buttons a partir da ToolBox e criar o seguinte leiaute:

Agora vamos implementar o código no formulário:

Declare no início do formulário as seguintes variáveis que são arrays de strings onde iremos armazenar os dados lidos dos arquivos .csv :

Dim nomes1() As String
Dim nomes2() As String

1- Botão - Ler Nomes - Código que lê o arquivo nomes1.csv e exibe no listbox

Private Sub btnLerNomes1_Click(sender As Object, e As EventArgs) Handles btnLerNomes1.Click

        Dim origem As String = "c:\dados\nomes1.csv"

        If File.Exists(origem) Then
            nomes1 = File.ReadAllLines(origem)
            lbNomes1.Items.AddRange(nomes1)
            btnLerNomes2.Enabled = True
        Else
            MessageBox.Show("O arquivo não existe.", "Não Existe")
        End If
    End Sub

 

2- Botão - Ler Nomes - Código que lê o arquivo nomes2.csv e exibe no listbox

Private Sub btnLerNomes2_Click(sender As Object, e As EventArgs) Handles btnLerNomes2.Click

        Dim origem As String = "c:\dados\nomes2.csv"

        If File.Exists(origem) Then
            nomes2 = File.ReadAllLines(origem)
            lbNomes2.Items.AddRange(nomes2)
            btnMesclarOrganizar.Enabled = True
        Else
            MessageBox.Show("O arquivo não existe.", "Não Existe")
        End If

    End Sub

 

3- Botão - Mesclar e organizar nomes - Código onde realizamos a consulta LINQ para mesclar os dados e criar arquivos com base no agrupamento feito.

  Private Sub btnMesclarOrganizar_Click(sender As Object, e As EventArgs) Handles btnMesclarOrganizar.Click

        ' Concatena e remove nomes duplicados
        Dim consultaMesclaArquivos As IEnumerable(Of String) = nomes1.Union(nomes2)
        ' Agrupa os nomes pela primeira letra no sobrenome
        Dim consultaAgruparNomes = From nome In consultaMesclaArquivos
                                                     Let n = nome.Split(New Char() {","})
                                                     Order By n(0)
                                                     Group By chaveGrupo = n(0)(0)
                                                     Into nomeGrupo = Group
        ' Cria um novo arquivo para cada grupo que foi criado
        ' Note que os laços foreach aninhados são requeridos para acessar
        ' os itens individuais de cada grupo
        For Each gGrupo In consultaAgruparNomes
            Dim nomeArquivo As String = "..'..'..'arquivoTeste_" & gGrupo.chaveGrupo & ".txt"
            Dim sw As New System.IO.StreamWriter(nomeArquivo)
            lbDados.Items.Add(gGrupo.chaveGrupo)
            For Each item In gGrupo.nomeGrupo
                lbDados.Items.Add("   " & item.nome)
                sw.WriteLine(item.nome)
            Next
            sw.Close()
        Next
 End Sub

O código é bem simples e esta comentado.

Executando o projeto novamente após esse ajuste teremos o seguinte resultado:

Pegue o projeto completo aqui :   Linq_Agrupar.zip

Porque a palavra da cruz é loucura para os que perecem; mas para nós, que somos salvos, é o poder de Deus.
Porque está escrito: Destruirei a sabedoria dos sábios, E aniquilarei a inteligência dos inteligentes.

1 Coríntios 1:18,19

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?


  Gostou
?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti