none
Manipulação de String Endereco para Endereco, Numero e Complemento

    Pergunta



  • Pessoal, estou ainda com dúvida quanto ao tratamento dessas strings de Endereço Completo que seguem:


    A) Rua Exemplo_A Exemplo_A, 777 (virgula e espaço, pegar apenas numero)

    B) Avenida Exemplo_B Exemplo_B, 321 C 97 (neste caso, depois da virgula do endereço tem um espaço em branco e após vem o Numero321 e C 97 será o Complemento)

    C) Rua Exemplo_C Exemplo_C, 347/529 (Aqui vou depois do numero, vou pegar a barra e o restante dos numeros)

    D) Rua Exemplo_D Exemplo_D,129/375 (depois da virgula separar)

    Sem Vírgula (,)  como delimitador:

    E) Rua Exemplo_E Exemplo_E 391 C 26

    (depois do espaço, pegar numeros antes do espaço)
    (depois do espaço, pegar do C em diante -> Complemento)

    F) Rua Exemplo_F Exemplo_F 528/93 

    (pegar 528 -> numero)
    (pegar /93 -> complemento)

    G) Rua Exemplo_G Exemplo_G 534\93

    (pegar 534 -> numero) 
    (pegar \93 -> complemento)


    H) Rua Exemplo_H Exemplo_H 521-93

    521-> Numero
    -93 -> Complemento

    Solicito colaboração para manipular alguns destes formatos de endereço para que sejam acertados os outros, gostaria de exemplo para trabalhar / tratar essas strings.

    Qualquer ajuda é bem vinda. Aguardo...


    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    quinta-feira, 12 de março de 2009 17:33

Respostas

Todas as Respostas

  •  Sugiro que você use uma expressão regular para extrair informações dessas strings. Fiz uma aqui pra te servir de exemplo:

    Dim testes As New List(Of String)  
    With testes  
        .Add("Rua Exemplo_A Exemplo_A, 777")  
        .Add("Rua Exemplo_C Exemplo_C, 347/529")  
        .Add("Rua Exemplo_D Exemplo_D,129/375")  
        .Add("Rua Exemplo_E Exemplo_E 391 C 26 ")  
        .Add("Rua Exemplo_F Exemplo_F 528/93 ")  
        .Add("Rua Exemplo_G Exemplo_G 534\93")  
        .Add("Rua Exemplo_H Exemplo_H 521-93")  
        .Add("Avenida Exemplo_B Exemplo_B, 321 C 97")  
    End With 
     
    Dim regex As New Regex("^(Rua|Avenida) ([a-z_\s]+)[, ]+(\d+)\s?([-/\da-z\\ ]+)?$", RegexOptions.IgnoreCase)  
     
    For Each endereco In testes  
        Dim m As Match = regex.Match(endereco)  
        Console.WriteLine(String.Format("Endereço: '{0}'", endereco))  
        Console.WriteLine(String.Format("Tipo logradouro: '{0}'", m.Groups(1).Value))  
        Console.WriteLine(String.Format("Logradouro: '{0}'", m.Groups(2).Value))  
        Console.WriteLine(String.Format("Número: '{0}'", m.Groups(3).Value))  
        Console.WriteLine(String.Format("Complemento: '{0}'", m.Groups(4).Value))  
        Console.WriteLine()  
    Next 
     
    Console.Read() 

    Você pode encontrar mais informações sobre expressões regulares no guia do Aurélio. O exemplo que eu fiz é bem simples e falha em casos como: Rua 13 de Maio, 234/45, mas isso eu deixo pra você resolver :). Qualquer dúvida posta ai!

    []'s
    quinta-feira, 12 de março de 2009 19:46

  •  
     Estou especificando com o seguinte código para tratar essas strings por regular expressions conforme o post anterior, porém as variáveis numero e complemento estao vindo com valores errados.

    Peço sugestões para obter o conteúdo correto correspondente:

     

    Dim cmd_Enderecos As New SqlCommand("SELECT [xx_id], [xx_end], [xx_novo], [xx_num], [xx_comp] FROM [DBCepaHom].[dbo].[AA_End] WHERE [xx_end] IS NOT NULL ORDER BY [xx_end]", connSQL)

    Dim daSQL_Enderecos As New SqlDataAdapter(cmd_Enderecos)

    Dim dtSQL_Enderecos As New DataTable

    'preenche o DataTable

     

    daSQL_Enderecos.Fill(dtSQL_Enderecos)

    '___________________________________________________________________________

     

    ' ABERTURA DA CONEXAO BASE SQL SERVER

     

    connSQL.Open()

    oConnSQL.BeginTrans()

    'inspeo dos dados do resultado da consulta no SQL SERVER

     

    Dim drSQL_Enderecos As DataRow

    For Each drSQL_Enderecos In dtSQL_Enderecos.Rows

    QtdReg_SQL_Enderecos += 1

    Dim EnderecoResultante As String = String.Empty

    Dim Numero As String = String.Empty '

     

    Dim Complemento As String = String.Empty

    Dim EnderecoCompleto As String = drSQL_Enderecos(1)

    Dim regex As New Regex("^(Rua|Avenida) ([a-z_\s]+)[, ]+(\d+)\s?([-/\da-z\\ ]+)?$", RegexOptions.IgnoreCase)

    For Each endereco In EnderecoCompleto

    Dim m As Match = regex.Match(endereco)

    EnderecoResultante = String.Format("Endereo: '{0}'", endereco)

    'Console.WriteLine(String.Format("Tipo logradouro: '{0}'", m.Groups(1).Value))

     

    'Console.WriteLine(String.Format("Logradouro: '{0}'", m.Groups(2).Value))

     

    Numero = String.Format("Nmero: '{0}'", m.Groups(3).Value)

    Complemento = String.Format("Complemento: '{0}'", m.Groups(4).Value)

    ' ATUALIZAO DE ENDEREOS *****************************************************************************************************************************

     

    Dim cmd_AtualizaEnderecos As New SqlCommand("UPDATE [DBCepaHom].[dbo].[AA_End] SET [xx_novo] = @xx_novo, [xx_num] = @xx_num, [xx_comp] = @xx_comp WHERE [xx_id] = @xx_id", connSQL)

    ' Campo ID

     

    cmd_AtualizaEnderecos.Parameters.AddWithValue("@xx_id", drSQL_Enderecos(0).ToString())

    ' Campo Endereo Resultante

     

    cmd_AtualizaEnderecos.Parameters.AddWithValue("@xx_novo", EnderecoResultante.ToString())

    ' CONVERT(NUMERIC(8,0)

     

    ' Campo Nmero

     

    If IsNumeric(Numero) Then

     

    cmd_AtualizaEnderecos.Parameters.AddWithValue("@xx_num", Numero)

    Else

     

    cmd_AtualizaEnderecos.Parameters.AddWithValue("@xx_num", DBNull.Value)

    End If

     

    'CType(Numero, Int32))

     

    ' Campo Complemento

     

    cmd_AtualizaEnderecos.Parameters.AddWithValue("@xx_comp", Complemento.ToString())

    Dim daSQL_AtualizaEnderecos As New SqlDataAdapter(cmd_AtualizaEnderecos)

    Dim dtSQL_AtualizaEnderecos As New DataTable

    'preenche o DataTable

     

    daSQL_AtualizaEnderecos.Fill(dtSQL_AtualizaEnderecos)

    Next

     

    Next drSQL_Enderecos

    End Sub


    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    sábado, 14 de março de 2009 23:41
  • O seu código parece correto. Entretanto não é possível descobrir qual o seu problema por falta de informações.

    Qual a entrada (endereço), o que o código atual retorna e qual a saída esperada?

    Repare que a expressão que passei deve servir somente para fins de exemplo! Como as descrições de endereços podem variar bastante você deve analisar com cuidado como funciona a expressão e qual o comportamento dela com diferentes formatos da string. Você encontra bastante material sobre expressões regulares na Internet.
    segunda-feira, 16 de março de 2009 15:07
  •  

    Por enquanto as variáveis que contém o conteúdo a ser atualizado não estão vindo com os valores corretos.


    Dim cmd_Enderecos As New SqlCommand("SELECT [xx_id], [xx_end], [xx_novo], [xx_num], [xx_comp] FROM [DBCepaHom].[dbo].[AA_End] WHERE [xx_end] IS NOT NULL ORDER BY [xx_end]", connSQL)

    Dim daSQL_Enderecos As New SqlDataAdapter(cmd_Enderecos)

    Dim dtSQL_Enderecos As New DataTable

    'preenche o DataTable

    daSQL_Enderecos.Fill(dtSQL_Enderecos)

    '___________________________________________________________________________

    ' ABERTURA DA CONEXAO BASE SQL SERVER

    connSQL.Open()

    oConnSQL.BeginTrans()

    'inspeo dos dados do resultado da consulta no SQL SERVER

    Dim drSQL_Enderecos As DataRow

    For Each drSQL_Enderecos In dtSQL_Enderecos.Rows

    QtdReg_SQL_Enderecos += 1

    Dim EnderecoResultante As String = String.Empty

    Dim Numero As String = String.Empty '

    Dim Complemento As String = String.Empty

    Dim EnderecoCompleto As String = drSQL_Enderecos(1)

    ' EXPRESSAO REGULAR AJUSTADA
    Dim regex As New Regex("^(RUA|Rua|R.|AVENIDA|Avenida|AV.|TRAVESSA|Travessa|TRAV.|Trav.) ([a-zA-Z_\s]+)[, ]+(\d+)\s?([-/\da-zDA-Z\\ ]+)?$", RegexOptions.IgnoreCase)

    For Each endereco In EnderecoCompleto

    Dim m As Match = regex.Match(endereco)

    EnderecoResultante = String.Format("Endereo: '{0}'", endereco)

    Numero = String.Format("Nmero: '{0}'", m.Groups(3).Value)

    Complemento = String.Format("Complemento: '{0}'", m.Groups(4).Value)

    __________________________________________________________________________


    Testei com debug passo-a-passo e está retornando o seguinte:

    >? EnderecoResultante

    "Endereo: 'A'"

    >? Numero

    "Nmero: ''"

    >? Complemento

    "Complemento: ''"

    No momento, vou precisar apenas destas variáveis sem considerar logradouro e tipo do mesmo.

    O EnderecoResultante terá somente o Endereço SEM Numero e SEM Complemento.



    A seguir, exemplos de endereços e o retorno que preciso, tratando essas strings.

    1) RUA FREDERICO DA SILVEIRA PEREZ, 7500

        EnderecoResultante: RUA FREDERICO DA SILVEIRA PEREZ

       
    Numero: 7500

        Complemento:  -




    2)
    AV. NOVA ZELÂNDIA, 2784

        EnderecoResultante: AV. NOVA ZELÂNDIA

       
    Numero: 2784

        Complemento:  -




    3)
    RUA ÍTALO FERREIRA 735

        EnderecoResultante: RUA ÍTALO FERREIRA 

        Numero: 735

        Complemento:  -



    4)
    RUA EURÍPEDES NETO, 591/634

        EnderecoResultante: RUA ÍTALO FERREIRA 

        Numero: 735

        Complemento:  -



    5) RUA CORONEL JOÃO LOPES Nº 7516 APTO 534


        EnderecoResultante: RUA CORONEL JOÃO LOPES 

        Numero: 7516

        Complemento:  APTO 534

    6) AV. DAS BROMÉLIAS 573 BL 382


       
    EnderecoResultante: AV. DAS BROMÉLIAS 

       
    Numero: 573

        Complemento:  BL 382



    Aguardando ajuda . . .



    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    segunda-feira, 16 de março de 2009 18:13


  • Conforme post anterior, estão apresentados os tipos de dados de entrada (Endereços - 6 exemplos) que serao separados usando expressoes regulares. 3 variáveis irão guardar essa separação que não está acontecendo certa, são elas: EnderecoResultante (sem numero e complemento), Numero e Complemento (com os exemplos de dados de sáida necessários)

    Estão sendo retornadas o seguinte com o código do post acima:


    Testei com debug passo-a-passo e está retornando o seguinte:

    >? EnderecoResultante

    "Endereo: 'A'"

    >? Numero

    "Nmero: ''"

    >? Complemento

    "Complemento: ''"

    No momento, vou precisar apenas destas variáveis sem considerar logradouro e tipo do mesmo.

    O EnderecoResultante terá somente o Endereço SEM Numero e SEM Complemento.



    Estou aguardando ajuda.



    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    sábado, 28 de março de 2009 17:43


  • Ajustei um outro novo algoritmo para tratar os Endereços. 

    E assim resolvi implementando manualmente empregando a lógica, usando um padrão de Endereços e critérios para separar corretamente em cada respectiva parte.

    Encontrei como solução para o Tratamento de Endereços, tratando cada entrada de Endereço vinda da base de dados considerando a separação nas variáveis:

    A) primeiraParte - o Endereço sem número e sem complemento

    B) Numero.

    C) Complemento.

    Outros detalhes estão esclarecidos neste link (solução sem regex):

    Posições de Elementos no Array
    http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/7e7692f9-b0d7-4397-8288-3e3b2314c82e


    Outro link relacionado, porém sugerindo a possibilidade de desenvolver com regular expressions:

    Tratamento de Endereços
    http://social.msdn.microsoft.com/Forums/pt-BR/transactsqlpt/thread/f20017a6-2e56-4f9a-8ac2-756f48289f47/


    Abraços, bons estudos e desenvolvimento.


    Magno Machado Borba |- Se o post foi util ou resposta nao esqueca de marcar.
    • Marcado como Resposta Magno Machado sexta-feira, 10 de abril de 2009 16:44
    sexta-feira, 10 de abril de 2009 16:43