Si una palabra está contenida en un campo texto se debe extraer la tercera palabra del campo

Señores expertos, como dice la pregunta necesito hacer una consulta en Access de acuerdo con la una tabla que tiene los campos ID, HABITANTE, OBSERVACION, para extraer del campo OBSERVACION la tercera palabra, si en este campo se encuentra la palabra "Madrid"

La columna TERCERA sería el resultado de la consulta. Me sirve con la cuadricula de diseño o mediante un script SQL.

Agradezco inmensamente la respuesta porque he dado muchas vueltas en Google y no encuentro algo que me lleve a la solución.

3 Respuestas

Respuesta
1

Martha tenga cuidado la respuesta "sencilla y didáctica" no SIRVE, por 2 motivos:

1. No se puede utilizar LIKE, porque se estuviera, por ejemplo, la palabra camadrid o Madridaña los tendría en cuenta. Además, sobran los &, es suficiente con Como "*madrid*"

2. ¿Dónde están los demás registros?

Lo explico con esta imagen

Esta consulta es con el criterio Como "*madrid*" por esto toma los registros encerrados en rojo.

Para hacer esto se deben utilizar funciones que faciliten el trabajo. He creado la tabla con los datos de su pregunta para ser más exactos.

DISEÑO DE LAL CONSULTA

TEXTO DE LA COLUMNA TERCERA

TERCERA: SiInm(busca_palabra([OBSERVACION];"Madrid")=Verdadero;Extraer([OBSERVACION];3);"")

Observe que utilizo las funciones, busca_palabra() y Extraer()

RESULTADO DE LA CONSULTA

COPIE ESTAS FUNCIONES EN UN MÓDULO

Public Function busca_palabra(ByVal strPalabras As String, strCadena As Variant) As Boolean
' Función para buscar palabra de una frase
' Sintaxis:
'               busca_palabra(<<texto>>,[palabra a buscar])
' Ejemplo de llamada:
'                      busca_palabra("soy de honda","honda") ---> Retorna True
'                      busca_palabra("soy hondano","honda")  ---> Retorna False
' Elaborada por:
'
'   Eduardo Pérez Fernández
'   Fecha: 29/09/2022
Dim palabras As Variant
Dim contador As Integer
palabras = Split(strPalabras, " ")
For contador = LBound(palabras) To UBound(palabras)
    strPalabras = palabras(contador)
    If strPalabras = strCadena Then
       busca_palabra = True
       Exit For
    End If
Next contador
End Function
Public Function extraer(strFrase As String, intPosicion As Integer) As String
'Función para estraer una palabra de una frase de acuerdo con la posición
'Parámetros:
' strFrase --> Frase a examinar
' intPosicion --> Posición de la palabra en la frase
'Ejemplo:
' extraer("Eduardo Pérez Fernández", 1) --- Retorna Eduardo (Primra palabra de la frase)
' extraer("Eduardo Pérez Fernández", 2) --- Retorna Pérez (Segunda palabra de la frase)
' extraer("Eduardo Pérez Fernández", 3) --- Retorna Fernández(Tercera palabra de la frase)
' extraer("Eduardo Pérez Fernández", 4) --- Retorna ! Error ...! (La posición supera el número de palabras)
'
'Elaborada Por:Eduardo Pérez Fernández
 'Fecha        :  5/10/2021
 Dim PalArray() As String
 Dim ctapalabras As Integer
 PalArray() = Split(strFrase)
 ctapalabras = UBound(PalArray()) + 1
 If ctapalabras < intPosicion Then
   extraer = "!! Error ...!!"
   Exit Function
 End If
 extraer = Split(strFrase)(intPosicion - 1)
End Function

Las funciones permiten no solamente extraer la tercera palabra, puede ser primera o segunda.

Martha, estuve revisando la consulta y se es necesario hacer una modificación, debido que cuando el campo OBSERVACION tiene menos de 3 palabras la función retorna "!! Error ...!!", aunque se puede editar para que retorne "".

Por ejemplo, como muestra la imagen en el ID=1 está la palabra Madrid, pero únicamente hay 2 palabras, en consecuencia, debe quedar en la columna TERCERA de la consulta "".

Contenido de TERCERA:

 SiInm(busca_palabra([OBSERVACION];"Madrid")=Verdadero Y contar_palabras([OBSERVACION])>=3;Extraer([OBSERVACION];3);"")

Ahora adicioné la función contar_palabras() que me permite contar las palabras de un campo. Adicione esta función al módulo.

FUNCIÓN CONTAR_PALABRAS

Function contar_palabras(strPalabras As String)
'Función para contar las palabras en una frase
'Ej. contar_palabras("Mi hermano del alma"
'Retorna 4
Dim WrdArray() As String
WrdArray() = Split(strPalabras)
contar_palabras = UBound(WrdArray()) + 1
End Function

Martha, conserve estas funciones tienen bastante utilidad, permiten llamarlas de VBA y facilitan la elaboración de consultas con la cuadricula y elaboración de script SQL.

Se me olvidó subir el resultado de la consulta

A pesar de que está la palabra "Madrid" no se toma porque NO existe una tercera palabra.

ENRIQUE, se nota que no tiene ni idea de lo que pregunta Martha, solo aporta comentarios dañinos para este foro, si le queda fácil le recomiendo hágase a un lado y deje que los usuarios aprendan ya que usted no quiere aprender. Ahora, si tiene una solución alterna será bien recibida así todos aprendemos, pero no vaya a decir que esto es PostgreSQL etc.

Eduardo, voy a estudiar las funciones para no limitarme a copiar, pero sus funciones por lo que aprecio solucionan mi duda de algo que me estaba dando vueltas.

No se desgaste con el inexperto ENRIQUE no vale la pena, no aporta nada

También puede probar esta función que trabaja con las otras funciones.

Public Function subs_xpos(strCadena As String, strBuscar As String, Optional posc As Integer, Optional boolmayor = False) As String
'Función para extraer una palabra de una frase si existe un patron
'Parámetros:
'            strBuscar   ----> Cadena a buscar en la frase
'            strCadena   ----> Frase que contiene la cadena a buscar
'(opcional)  posc        ----> Posición de la palabra en la frase. Si omite se asigna 1
'(opcional)  boolmayor   ----> Si es False y el valor posc es mayor que las palabras retorna vbNullString.
'                              Si es True y el valor posc es mayor que las palabras retorna la última palabra
'                              Si omite el parámetro se toma como False
'Ejemplos:
'Obtener la 5 palabra de la frase si contiene la palabra pérez
'   subs_xpos("eduardo pérez fernández de honda","pérez",3)
'Retorna: fernández
'   subs_xpos("eduardo pérez fernández de honda","pérez",6,True)
'Retorna: honda
'
'Elaborado por: EDUARDO PEREZ FERNANDEZ
'Fecha:       : 10/02/2023
'Requiere de las funciones:
'                            busca_palabra()
'                            contar_palabras()
'                            extraer()
 Dim palabras As Integer
 If posc = 0 Then
   posc = 1
 End If
  If busca_palabra(Trim(strCadena), Trim(strBuscar)) Then
    palabras = contar_palabras(Trim(strCadena))
    If posc > palabras Then
      If boolmayor = False Then
       subs_xpos = vbNullString
      Else
        subs_xpos = extraer(Trim(strCadena), palabras)
      End If
    Else
     subs_xpos = extraer(Trim(strCadena), posc)
    End If
 End If
End Function

Lea la explicación de la definición de los parámetros.

Respuesta
1

Voy a tratar de ser lo más sencillo y didáctico. Si tengo una tabla como

Y construyo una consulta como

Debajo de CampoA lo que pone en la casilla criterios es

Como "*" & "madrid" & "*"

Para que me deje sólo los registros que contengan la palabra madrid. Cuando abro la consulta

Digamos que va recortando por ambos lados.

¡Gracias!  Julián me parece interesante como ha divido la consulta, lo único sería revisar lo del LIKE, pero le repito excelente.

Respuesta

Respuesta requerida:

Supongo que no tengo que explicar como se utiliza una función así que simplemente la publico:

Public Function Palabra3(Origen$, Dato$, Pos&) As String
If InStr(" " & Origen & " ", " " & Dato & " ") = 0 Then Exit Function
Dim Lista
Lista = Split(Origen)
Pos = Pos - 1
If UBound(Lista) < Pos Then Exit Function
Palabra3 = Lista(Pos)
End Function

(

Por si acaso:

Origen ==> la cadena de texto (puede ser un campo de la consulta)
Dato ==> el texto a localizar en la cadena anterior
Pos ==> la posición del la palabra que se desea obtener

El planteamiento y su resolución practica:

.- Se solicita que en si en una cadena de texto se encuentra una determinada palabra, se obtenga (de esa misma cadena de texto) la tercera palabra sin importar cuál sea.

.- Queda la duda de que ocurre si la cadena de texto tiene menos de tres palabras.

.- La palabra no puede ser parte de otra que la contenga, por lo que se le añade un espacio al inicio y al final.
.- Por si se diera la circunstancia de que comenzase o finalizase por la palabra a localizar, a la cadena también se le añade un espacio delante y otro al final.

.- Con la función InStr se verifica que existe, si no existe se aborta (devuelve una cadena vacía)

.- Se dimensiona una variable para crear un array

.- Con la función Split se llena el array

.- Como el array comienza en cero, se le resta una unidad a la posición

.- Si el número de elementos es inferior a la posición a obtener se aborta (devuelve una cadena vacía)

.- Se le asigna a la función la palabra localizada como valor retornado

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas