Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

nobody32165479

[Resolvido] VB.NET como armazenar dados e somar repetições?

Recommended Posts

Estou tentando criar um sisteminha que faz o seguinte:

Lê uma tabela no excel e vai adicionando o conteúdo em uma lista, só que quando se repete um item ele soma +1. Por exemplo

Nome CPF RG Repetições

Airton 35035045685 775446489 10

José 35035045685 775446489 10

 

Eu tinha feito isso com um datagrid mas ficou muito lento quando eu coloco para ler uma tabela de 10000 ou quando existem muitas variações, pois eu coloquei ele para ler a datagrid em busca de repetições...

Oq vcs me indicam? Tb tentei com array e com classes mas não consegui... Se puderem postar exemplos agradeceria tb!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por exemplo se meu nome aparecer mais de uma vez na tabela do excel (que o programa vai ler linha por linha) ele vai somar 1 no meu nome que esta armazenado em alguma lista dentro do programa como uma array por exemplo.

 

Vou detalhar a rotina do programa:

-Abre o excel. OK

-Faz uma varredura linha pro linha com um while not .worksheets(1).range("A" e n).value = "". OK

-Dentro desta varredura ele deve adicionar os nomes encontrados em uma lista qualquer e nesta lista deveram ter 2 colunas uma com o nome do individuo e outra com o número de vezes que ele aparece no excel < Meu problema está aqui

 

Eu até consegui fazer com um datagrid adicionando as linhas e cada vez que ele adicionava ele fazia um loop dentro do datagrid para ver se o nome já estava na lista e se estava ele somava +1 na coluna de vezes que o nome aparece, funcionou só que quando ou pego uma tabela maior (de > 10000 linhas) ele fica muito lento. Gostaria de aprender a criar algum tipo de tabela rápida que tenha as funções:

 

-Múltiplas colunas (Nome/Endereço/Telefone/CPF/Escola/etc)

-Verificação automática se já existe um item com o nome ou endereço ou telefone e etc... Tipo na array que tem o exists(que eu não entendi como usar).

-E rápido oq é mais importante pq eu tentei com uma classe mas ficou muito lento, não sei se foi pq eu fiz errado ou alguma coisa...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz com o Generics, ele tem tudo que eu preciso, mas não consigo usar a opção exists no array eu usava assim:

 

Dim pss As New Pessoa
pss.Nome = .Worksheets(1).range(AI & Nb).value
pss.Email = 1

if Pessoa.exists(pss) = true then
'código para somar
else
'código para adicionar uma nova pessoa
end if

como eu faço no generics?

 

Eu testei do geito que eu estava fazendo:

 

                Dim pss As New Pessoa
                pss.Nome = .Worksheets(1).range(AI & Nb).value
                pss.Email = 1
                If pessoas.Count <= 1 Then
                    pessoas.Add(pss)
                Else
                    For N = 0 To (pessoas.Count - 1)
                        If pessoas(N).Nome = .Worksheets(1).range(AI & Nb).value Then
                            pss.Nome = .Worksheets(1).range(AI & Nb).value
                            pss.Email = pessoas(N).Email + 1
                            pessoas(N) = pss
                            Exit For
                        Else
                            If (N + 1) = (pessoas.Count - 1) Then
                                pss.Nome = .Worksheets(1).range(AI & Nb).value
                                pss.Email = 1
                                pessoas.Add(pss)
                                Exit For
                            End If
                        End If
                    Next
                End If
                End If

Só que fica muito lento

Compartilhar este post


Link para o post
Compartilhar em outros sites

O programa está assim:

 

Detalhe estou usando o campo e-mail para contar o número de repetições (só para teste deposi eu mudo).

 

Módulo que vai puxar os dados e gerar um relatório de nomes repetidos na lista:

Imports System
Imports System.Collections.Generic
Module GeraRelatorio
    Dim EApp As New Microsoft.Office.Interop.Excel.Application
    Dim EwkB As Object
    Dim EwkS As Object
    Dim Nb, N As Integer
    Dim pessoas As New List(Of Pessoa)

    Public Sub Gerar_Relatorio()
        pessoas.Clear()
        With EApp
            .Visible = False
            .Workbooks.Open(Form1.Text_Nome_XLS.Text)

            Dim N As Integer 'Conta o número de linhas existentes no excel'
            Dim fim As Boolean
            N = 2
            fim = False
            While Not .Worksheets(1).range("B" & N).value = ""
                If fim = False Then
                    N = N + 1000
                    If .Worksheets(1).range("B" & N).value = "" Then
                        fim = True
                        N = N - 1000
                    End If
                Else
                    N = N + 1
                End If
            End While

            Form1.Barra_de_Progresso.Maximum = N 'Iniciar a leitura do arquivo linha por linha'

            For Nb = 2 To N
                If .Worksheets(1).range("B" & Nb).value = "" Then 'Verifica se o documento acabou'
                    Exit For
                End If
                Tipos()
            Next

            Form1.ListBox1.Items.Clear()
            For Nb = 0 To (pessoas.Count - 1)
                Form1.ListBox1.Items.Add(pessoas(Nb).ID & " - " & pessoas(Nb).Nome & " - " & pessoas(Nb).Email) 'Gera o relatorio'
            Next

             .Workbooks(1).Close()
    End Sub

    Private Sub Tipos()
        With EApp
            If Not .Worksheets(1).range("B" & (Nb - 1)).value = .Worksheets(1).range("B" & Nb).value Then
                Dim pss As New Pessoa
                pss.Nome = .Worksheets(1).range(AI & Nb).value
                pss.Email = 1
                If pessoas.Count <= 1 Then
                    pessoas.Add(pss)
                Else
                    For N = 0 To (pessoas.Count - 1)
                        If pessoas(N).Nome = .Worksheets(1).range(AI & Nb).value Then
                            pss.Nome = .Worksheets(1).range(AI & Nb).value
                            pss.Email = pessoas(N).Email + 1
                            pessoas(N) = pss
                            Exit For
                        Else
                            If (N + 1) = (pessoas.Count - 1) Then
                                pss.Nome = .Worksheets(1).range(AI & Nb).value
                                pss.Email = 1
                                pessoas.Add(pss)
                                Exit For
                            End If
                        End If
                    Next
                End If
                End If
        End With
    End Sub

End Module

 

A Classe pessoas:

 

 

Public Class Pessoa

    Private _id As Integer
    Private _nome As String
    Private _email As String

    Public ReadOnly Property ID() As Integer
        Get
            Return _id
        End Get
    End Property

    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal value As String)
            _nome = value
        End Set
    End Property

    Public Property Email() As String
        Get
            Return _email
        End Get
        Set(ByVal value As String)
            _email = value
        End Set
    End Property

End Class

Alguém tem uma idéia de como isso poderia ficar mais rápido???

VLW!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para encontrar um objeto especifico dentro da lista utilize o metodo Find(). A partir disso você poderá criar um metodo Exist semelhante ao existente no ArrayList, Segue um exemplo abaixo de como utilizar Find() para procurar um objeto dentro de uma lista em VB.NET

 

------------------------------------

Dim objeto As objeto = myList.Find(Function(i) i.propriedade = valor)

------------------------------------

 

Acho que isso não funciona em 2.0, mas você pode tentar utilizando um predicate (of T)..

 

-----------------------------

Private "variavel" As "tipo"

 

variavel = valor

Dim objeto As objeto = myList.Find(AddressOf "metodo")

 

Private Function "metodo"(ByVal objeto As objeto ) As Boolean

Return objeto.propriedade = "variavel"

End Function

--------------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consigo usar esses caras... http://forum.imasters.com.br/public/style_emoticons/default/cry.gif

Vou apelar para o listbox:

    Dim Nome As New ListBox
    Dim NNome As New ListBox

              
                If Nome.FindString(.Worksheets(1).range(AI & Nb).value) > -1 Then
                    Dim i As Integer = Nome.FindString(.Worksheets(1).range(AI & Nb).value)
                    NNome.Items(i) = NNome.Items(i) + 1
                Else
                    Nome.Items.Add(.Worksheets(1).range(AI & Nb).value)
                    NNome.Items.Add(1)
                End If
              

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é que deu certo com o lisbox??? :blink: E até que está rápido, a lista de 10'000 demora uns 15 minutos para ler várias variaveis diferentes... :huh: Mas tá bom! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Vlw pela ajuda de vcs!!! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Té + http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

 

PS. como eu faço para encerrar este tópico (colocar como concluído)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.