Fala galera!
Não sei se esse tópico se enquadraria em Java Avançado, mas aí vai.
Tô precisando fazer um saneamento numa base de dados na tabela de clientes. A tabela de Clientes não está normalizada e temos hoje a necessidade de melhorar (normalizar) os campos de endereço.
Para o campo logradouro estou querendo aplicar expressão regular e tentar recuperar um padrão (que mais se repita) para separar o campo em tipo logradouro, logradouro, número e complemento.
Alguém já precisou fazer isso?
Alguém tem alguma luz que possa me adiantar?
Cacilda, esse tipo de coisa (que é normalização de dados) é bem chatinha mesmo.
Acho que provavelmente é melhor você gerar um arquivo-texto (que deve conter milhares de endereços) e tentar (talvez usando Perl, Python, awk ou mesmo Java) achar algumas expressões regulares que consigam fazer o que você quer.
Você vai ver que isso vai dar um bom trabalho, e alguns endereços vão sobrar que devem ser normalizados “manualmente”.
Por exemplo, o tipo de logradouro “Rua” pode ser:
R
r
Rua
R.
R .
rúa
roa
rrua
ru.
r:
e assim por diante. (Não se esqueça que quem cadastrou os endereços pode nem saber português direito, portanto você tem de se precaver contra eventuais abreviaturas esquisitas mas perfeitamente válidas. )
Algebra
Uma idéia para esse logradouro aew, vc poderia fazer assim:
Stringtudo="Rua são Bento, 524, próx. ao Fórum";Stringrua,num,comp="";comp=tudo.replaceAll("([\\D])+[\\d]+([\\D])","$1");num=tudo.replaceAll("(\\D)","");rua=tudo.replaceAll("(\\d)+(\\D)","");
implementei rapidamente uma idéia aqui pra vc oks.
by_stoco
Algebra:
Uma idéia para esse logradouro aew, vc poderia fazer assim:
Stringtudo="Rua são Bento, 524, próx. ao Fórum";Stringrua,num,comp="";comp=tudo.replaceAll("([\\D])+[\\d]+([\\D])","$1");num=tudo.replaceAll("(\\D)","");rua=tudo.replaceAll("(\\d)+(\\D)","");
implementei rapidamente uma idéia aqui pra vc oks.
Vou ter q fazer um algoritmo pra testar alguns padrões de endereços que estão sendo usados. Sei que são uma porrada, mas vou tentar descobrir a maioria. Vou utilizar a tua ideia Algebra, pra tentar chegar num melhor resultado.
O que sobrar vai pro estagiário fazer na mão mesmo!
Exemplo de endereço: String logradouro = "Rua Nome Da Rua, 110/808"
Como eu faço pra testar esse padrão utilizando ER?
:?: Qual expressão regular eu teria que fazer pra saber se logradouro se encaixa no padrão?
by_stoco
Encontrei alguns padrões de endereços:
/** * ### Padrões de Logradouros ### * p1 - R. Pedro Americo, 110 * p2 - R. Pedro Americo 110 apt 808 | R. Pedro Americo, 110, 808 * p3 e p4 - R GAL RAMIRO NORONHA - CASA 52 * p5 - R FELIPE NERI, 239, | R FELIPE NERI, 239/ * p6 - R 20 DE SETEMBRO, 1487 / 63 * p7 - Rua Professor Marcos Martini, 1075, 32B */publicstaticfinalHashMap<Long,String>LISTA_PADRAO_LOGRADOURO=newLinkedHashMap<Long,String>();static{LISTA_PADRAO_LOGRADOURO.put(newLong(1),"[\\D]+[\\d]+");LISTA_PADRAO_LOGRADOURO.put(newLong(2),"[\\D]+[\\d]+[\\D/\\D]+[\\d]+");LISTA_PADRAO_LOGRADOURO.put(newLong(3),"[\\D]+[casa\\D]+[\\d]+");LISTA_PADRAO_LOGRADOURO.put(newLong(4),"[\\D]+[cs\\D]+[\\d]+");LISTA_PADRAO_LOGRADOURO.put(newLong(5),"[\\D]+[\\d]+[\\D]+");LISTA_PADRAO_LOGRADOURO.put(newLong(6),"[(\\D)|(\\d)]+[,][\\s]+[\\d]+[(\\D)|(\\d)]+");LISTA_PADRAO_LOGRADOURO.put(newLong(7),"[\\D]+[\\d]+[(\\D)|(\\d)]+");}
Agora vou criar uma rotina para montar novamente esses endereços.