Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2007
danilo_candales danilo_candales is offline
Miembro
 
Registrado: nov 2007
Posts: 28
Poder: 0
danilo_candales Va por buen camino
Algoritmo para comparacion de cadenas

Saludos a todos.

Aunque llevo mucho tiempo entrando a este foro, investigando en el tan completo histórico de respuestas, nunca me había decidido a darme de alta. Me da hasta un poco de pena intentar responder algo entre tantos gurús....

Pero ahora tengo una gran necesidad acerca de un algoritmo y apelo a ustedes para que me den cualquier idea.

Programo con Delphi7 y SQL Server 2005. Y el asunto es el siguiente:

Los pongo en antecedentes:
Tengo una tabla MARCADOS con un campos Nombre nChar(200) (No se puede separar el nombre en apellidos ni nada, debe ser así porque es información que viene de fuente externa). En este campo tengo nombres en distinos idiomas, incluso indios, árabes, etc Ej: "Thiha Thura Tin Aung Myint"

En un archivo texto me entregan una lista de nombres (subí esa lista a otra tabla para guardar esos nombres). Así que tengo otra tabla INVESTIGADOS con campos Nombre nchar(200) igual que la anterior.... y un campo Existe bit donde marco si el registro de INVESTIGADOS existe en MARCADOS.

Con estos antecedentes mi problema está en que la comparación no es exacta, debo seguir estas reglas, que les voy a dar con un ejemplo:

Si en MARCADOS está el nombre "ossama bin laden" y en INVESTIGADOS viene como "sama laden" debe marcarse el campo Existe como True..

Cualquier idea será muy bien recibida. Muchas gracias a todos.
Responder Con Cita
  #2  
Antiguo 14-11-2007
Avatar de BuenaOnda
BuenaOnda BuenaOnda is offline
Miembro
 
Registrado: feb 2006
Ubicación: La Serena - Chile
Posts: 347
Poder: 19
BuenaOnda Va por buen camino
Hola..

Podrias utilizar el operador LIKE, para realizar eso...Solo deberias preguntar si la sub-cadena, en este caso correpondiente a parte del nombre, existe, entonces actualizas ese campo como marcado.

mira este hilo http://technet.microsoft.com/es-es/l.../ms179859.aspx.

Espero haberte ayudado en algo...
Responder Con Cita
  #3  
Antiguo 14-11-2007
danilo_candales danilo_candales is offline
Miembro
 
Registrado: nov 2007
Posts: 28
Poder: 0
danilo_candales Va por buen camino
gracias

Muchas gracias.

Creo que si me sirve mucho lo que me dices.
A ver esta idea que te parece... Es cuestión que después que la implemente funcione bien... ya los pondré al tanto.

Bueno. Se me ocurre tomar el campo Investigados.Nombre y crear tantas cadenas como palabras existen en nombre: Ej:
"Thiha Thura Tin Aung Myint" daría como resultado 5 cadenas de caracteres

Fabricar la sentencia select con tantos likes como cadenas resultaron, algo así:

Select nombre
FROM Marcados
WHERE (Nombre LIKE '%cadena1%') AND (nombre LIKE '%cadena2%') etc...

Funcionará? Les parece bien? Por favor comenten lo que se les ocurra...
Gracias de nuevo.
Responder Con Cita
  #4  
Antiguo 14-11-2007
fide fide is offline
Miembro
 
Registrado: oct 2006
Posts: 331
Poder: 18
fide Va por buen camino
Lightbulb Usar SQL!

Esa idea no esta mala. Pero cuidado a la hora de redactar tu consulta. Ademas tratare de ayudarte para buscar una mejor forma de hacer lo que dices!
Responder Con Cita
  #5  
Antiguo 14-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Vas a tener muchos falsos positivos, pero en fin....

En lugar de "LIKE" usa "CONTAINS" parece más versatil.

Pero no te atañas a lo dicho aquí, en esa web puedes mirar otras opciones.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 14-11-2007
danilo_candales danilo_candales is offline
Miembro
 
Registrado: nov 2007
Posts: 28
Poder: 0
danilo_candales Va por buen camino
Muchas gracias nuevamente.

Estuve con el tema de utilizar CONTAINS, pero me marca este error:

"No se puede usar el predicado CONTAINS o FREETEXT en tabla o vista indizada 'marcador', porque no está indizado por texto.

Sugerencias?
Responder Con Cita
  #7  
Antiguo 14-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Por lo visto tienes que crear un índice en la base de datos por el campo donde vas a usar contains.... qué se le va a hacer ...

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 14-11-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por danilo_candales Ver Mensaje
Muchas gracias.

Creo que si me sirve mucho lo que me dices.
A ver esta idea que te parece... Es cuestión que después que la implemente funcione bien... ya los pondré al tanto.

Bueno. Se me ocurre tomar el campo Investigados.Nombre y crear tantas cadenas como palabras existen en nombre: Ej:
"Thiha Thura Tin Aung Myint" daría como resultado 5 cadenas de caracteres

Fabricar la sentencia select con tantos likes como cadenas resultaron, algo así:

Select nombre
FROM Marcados
WHERE (Nombre LIKE '%cadena1%') AND (nombre LIKE '%cadena2%') etc...

Funcionará? Les parece bien? Por favor comenten lo que se les ocurra...
Gracias de nuevo.
Esto me parece adecuado siempre y cuando las cadenas que estas colocando en los LIKE coincidan al 100% con el nombre, pero, si quieres que el nombre contenga al menos una de las cadenas necesitas usar el OR en lugar del AND.

Por lo del CONTAINS, no tengo idea de como hacerlo, pero ya Lepe te ha dado un tip.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney

Última edición por egostar fecha: 14-11-2007 a las 21:51:43.
Responder Con Cita
  #9  
Antiguo 17-11-2007
danilo_candales danilo_candales is offline
Miembro
 
Registrado: nov 2007
Posts: 28
Poder: 0
danilo_candales Va por buen camino
Bueno. Muchas gracias a todos, hayan o no participado porque sé que el que no contestó es porque vió que ya el curso a seguir estaba dado.

Para cerrar el asunto les cuento que me fuí con la variante de BuenaOnda, crear tantos LIKE como cadenas tiene el nombre a buscar. Intenté con CONTAINS pero, por las características de la aplicación, es bastante enredoso eso de crear el índice compuesto y el catálogo, y después distribuirlo, mantenerlo actualizado, etc, etc....

Por otra parte no supe como hacer que CONTAINS o FREETEXT me compararan solo una parte de la cedena, utilizando el * como comodín solo me sirve para las terminaciones. Ej: Marcel* me localiza todos los registros con prefijo "Macel", pero esto *arcel* no funciona.....

En fin, esto es solo una historia corta para agradecerles nuevamente y asunto terminado, a entrarle a algo nuevo ahora.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Procedimientos para separar cadenas ixMike Varios 14 12-09-2016 04:51:21
Algoritmo para calcular el BPM turminator Varios 0 29-05-2007 00:19:49
comando en sql para comparar cadenas karla SQL 2 30-12-2006 22:55:12
Algoritmo para obtener las letras de etiqueta en personas físicas. Anagrama. setry2 Varios 0 18-07-2005 15:55:36
comparación de cadenas perico Varios 1 22-06-2004 23:52:28


La franja horaria es GMT +2. Ahora son las 18:13:17.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi