** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Extraer texto de campo
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoExtraer texto de campo

 Responder Responder Página  12>
Autor
Mensaje
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Tema: Extraer texto de campo
    Enviado: 17/Septiembre/2019 a las 20:15
Saludos una vez mas,

Tengo un campo descripciones como la siguiente imagen, de la cual requiero extraer en otra columna parte de ese texto. Los campos mostrados son solo aquellos en los que quiero aplicar la funcion, tengo parte de la funcion con Like, IIF y Mid pero me falta completar la funcion para extraer la información deseada.

Extraer: IIf([Descripciones] Like "*GAGE*",Mid([Descripciones],16,6),"")

Los primeros nueve registros los extraje con la funcion arriba mencionada, porque la longitud de ellos es constante pero el resto de los registros tienen variantes al principio de la cadena. Hay alguna forma de extraer los textos requeridos.

NOTA: Requiero extraer los textos resaltados en color rojo.

Extraer






































Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5704
Enlace directo a este mensaje Enviado: 17/Septiembre/2019 a las 21:22
Hola Erick
Puedes usar las funciones de texto para obtener lo que quieres, por ejemplo con InStr puedes sacar en que posición comienza GAGE y sabiendo eso puedes buscar el siguiente espacio en blanco también con InStr y una vez que tienes ambos resultados con Mid obtienes el resultado, teniéndolo a una parte de ellos le quieres quitar GAGE, pero eso te lo voy a dejarte a ti que lo intentes solo te diré con con IIf vas bien.

Saludos.


Editado por emiliove - 17/Septiembre/2019 a las 21:23
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 17/Septiembre/2019 a las 23:15
Creo ahi va emiliove:

Extraer: IIf([Descripciones] Like "*GAGE*",Mid([Descripciones],InStr(11,[Descripciones],"GAGE")+4))

Extraer

Me estoy comiendo el GAGE en los primeros seis registros como lo muestra la imagen.
Y como corto el texto marcado en rojo a la derecha, asumo que un Right?

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 17/Septiembre/2019 a las 23:39
A mi me parece que no es tan sencillo. 

Yo he optado por partir la cadena en busca del fragmento que contenga un - 

Esto me funciona (lo he tratado como si estuviera en una tabla):

Function Erick()
    Dim rst As DAO.Recordset
    Dim arrParts    As Variant
    Dim i           As Integer
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM Tabla1")
    
    Do Until rst.EOF
        arrParts = Split(rst!Descripciones, " ")
        For i = 0 To UBound(arrParts)
            If InStr(1, arrParts(i), "-") Then
                rst.Edit
                rst!Extraer = arrParts(i)
                rst.Update
                Exit For
            End If
        Next
        rst.MoveNext
    Loop
    
    rst.Close
    Set rst = Nothing
End Function


Xavi, un minyó de Terrassa

Mi web
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 17/Septiembre/2019 a las 23:59
Gracias Xavi por el aporte, 

Trate de comentar el codigo con los elementos que entiendo favor de corregirme si estoy mal.

Otra cosa no me corrio la funcion me marco error comentado en el codigo:

Function Erick()
    Dim rst As DAO.Recordset
    Dim arrParts    As Variant
    Dim i           As Integer
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM Tabla1") 'Sustitui por el nombre de mi tabla
    
    Do Until rst.EOF
    'Parte la cadena separandolo por espacios y metiendolos al array
        arrParts = Split(rst!Descripciones, " ") '<-- Me marca error 94 Invalid use of null
        'Recorre el array en busca del "-"
        For i = 0 To UBound(arrParts)
            If InStr(1, arrParts(i), "-") Then
            'Pone la tablae en modo edición
                rst.Edit
                'Que hace en esta parte?
                rst!Extraer = arrParts(i)
                'Que actualiza exacamente?
                rst.Update
                Exit For
            End If
        Next
        rst.MoveNext
    Loop
    
    rst.Close
    Set rst = Nothing
End Function

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5704
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 00:17
Con consultas
Lo voy a hacer separado para que veas: tenemos la tabla 1

Tabla1
Id Nombre
1 Mandatory GAGE G-305 is requered per plant specific work instruction
2 Mandatory GAGE G-315 is requered per plant specific work instruction
3 Mandatory GAGE G-318 is requered per plant specific work instruction
4 Mandatory GAGE G-3222 is requered per plant specific work instruction
5 Optinal inspection GAGE G-002-14 per plant specific work instruction
6 Optinal inspection GAGE G-005-14 per plant specific work instruction
7 Optinal inspection GAGE G-002-204 per plant specific work instruction
8 Optinal inspection GAGE 15 per plant specific work instruction
9 Optinal inspection GAGE 18 per plant specific work instruction

Y sacamos con InStr los dos datos que requerimos el donde inicia GAGE y el del espacio después de los números, después los usamos en Mid y listo

SELECT Tabla1.Id, Tabla1.Nombre, InStr([Nombre],"GAGE") AS otro, InStr([otro]+5,[Nombre]," ") AS otro1, Mid([Nombre],[otro],[otro1]-[otro]) AS Obtener, IIf(Len([Obtener])>8,Right([Obtener],Len([obtener])-5),[obtener]) AS Expr1
FROM Tabla1;

Obtenemos:
Consulta2
Id Nombre otro otro1 Obtener Expr1
1 Mandatory GAGE G-305 is requered per plant specific work instruction 11 21 GAGE G-305 G-305
2 Mandatory GAGE G-315 is requered per plant specific work instruction 11 21 GAGE G-315 G-315
3 Mandatory GAGE G-318 is requered per plant specific work instruction 11 21 GAGE G-318 G-318
4 Mandatory GAGE G-3222 is requered per plant specific work instruction 11 22 GAGE G-3222 G-3222
5 Optinal inspection GAGE G-002-14 per plant specific work instruction 20 33 GAGE G-002-14 G-002-14
6 Optinal inspection GAGE G-005-14 per plant specific work instruction 20 33 GAGE G-005-14 G-005-14
7 Optinal inspection GAGE G-002-204 per plant specific work instruction 20 34 GAGE G-002-204 G-002-204
8 Optinal inspection GAGE 15 per plant specific work instruction 20 27 GAGE 15 GAGE 15
9 Optinal inspection GAGE 18 per plant specific work instruction 20 27 GAGE 18 GAGE 18

Saludos.


Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 00:26
Emilio: el quid de la cuestion es que no siempre la palabra GAGE debe ser extraida (o eso entiendo yo del primer post)

Erick
Si te marca error es porque tienes un registro dónde el campo Descripciones es nulo. Cambia la línea por esta:
arrParts = Split(Nz(rst!Descripciones, ""), " ")


rst!Extraer = arrParts(i)

Al recorrer el array en busca de un elemento que contenga el caracter "-" y encontrarlo, simplemente almacena ese valor en el campo Extraer de la tabla (he asumido que en la tabla tenemos un campo Descripciones y otro Extraer)

Xavi, un minyó de Terrassa

Mi web
Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5704
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 00:34
Hola Xavi

En mi ejemplo solo el registro 8 y 9 se extrae el GAGE. como lo quiere Erick

Saludos.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 00:41
Sorry! lo lei mal 
Xavi, un minyó de Terrassa

Mi web
Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5704
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 00:48
Pero tienes razón, lo vi mal, aparentemente todos comienzan después de GAGE con una G y los que son con numero si va la palabra GAGE, si así es correcto yo revisaría si es numero y actuaria en consecuencia.

Edito:
Algo así:
SELECT Tabla1.Id, Tabla1.Nombre, InStr([Nombre],"GAGE") AS otro, InStr([otro]+5,[Nombre]," ") AS otro1, Mid([Nombre],[otro],[otro1]-[otro]) AS Obtener, IIf(Len([Obtener])>8,Right([Obtener],Len([obtener])-5),[obtener]) AS Expr1, IsNumeric(Mid([obtener],6,1)) AS esnumero, IIf(([esnumero])=0,Right([Obtener],Len([obtener])-5),[obtener]) AS Expr2
FROM Tabla1;

Consulta2
Id Nombre otro otro1 Obtener Expr1 esnumero Expr2
1 Mandatory GAGE G-305 is requered per plant specific work instruction 11 21 GAGE G-305 G-305 0 G-305
2 Mandatory GAGE G-315 is requered per plant specific work instruction 11 21 GAGE G-315 G-315 0 G-315
3 Mandatory GAGE G-318 is requered per plant specific work instruction 11 21 GAGE G-318 G-318 0 G-318
4 Mandatory GAGE G-3222 is requered per plant specific work instruction 11 22 GAGE G-3222 G-3222 0 G-3222
5 Optinal inspection GAGE G-002-14 per plant specific work instruction 20 33 GAGE G-002-14 G-002-14 0 G-002-14
6 Optinal inspection GAGE G-005-14 per plant specific work instruction 20 33 GAGE G-005-14 G-005-14 0 G-005-14
7 Optinal inspection GAGE G-002-204 per plant specific work instruction 20 34 GAGE G-002-204 G-002-204 0 G-002-204
8 Optinal inspection GAGE 15 per plant specific work instruction 20 27 GAGE 15 GAGE 15 -1 GAGE 15
9 Optinal inspection GAGE 18 per plant specific work instruction 20 27 GAGE 18 GAGE 18 -1 GAGE 18

Saludos.


Editado por emiliove - 18/Septiembre/2019 a las 01:14
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 09:00
Yo optaría por otro camino.

- memorizo el literal completo:
Xs = Literal

- elimino el literal de inicio que no quiero:
Xs = replace(xs, "MANDATORY GAGE ", "")
Xs = replace(xs, "OPTIONAL INSPECTION GAGE ", "")
Xs = replace(xs, "OPTIONAL INSPECTION ", "")

importante el blanco final de la cadena a eliminar y hacer los cambios en este orden

- nos quedamos con la primera palabra del literal que nos queda:
Resultado = split(Xs, " ") (0)


Ojo escrito todo ello al vuelo, si se hace con un recordset se puede dejar tal cual, si es con una consulta habría que crear una función




Editado por Mihura - 18/Septiembre/2019 a las 09:01
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 16:13
He probado las aportaciones publicadas (Xavi, emiliove) y funcionan de maravilla, salvo el codigo de Mihura que no lo he podido adaptar estoy metiendole en un RecordSet obteniendo el siguiente error:

Sub Mihura()

Dim rst As DAO.Recordset
Dim Literal As String
Dim Xs As String
Dim Resultado As String

Xs = Literal
Set rst = CurrentDb.OpenRecordset("Select * from Tabla1")
If rst.RecordCount = 0 Then Exit Sub




rst.MoveLast
rst.MoveFirst
 
Do Until rst.EOF
    Xs = Replace(Xs, "MANDATORY GAGE ", "")
    Xs = Replace(Xs, "OPTIONAL INSPECTION GAGE ", "")
    Xs = Replace(Xs, "OPTIONAL INSPECTION ", "")
    'rst.Update
    rst.MoveNext
    Loop
Resultado = Split(Xs, " ")(0) 'Aqui obtengo el error<---Lo almacena en una variable, o tengo que actualizar directamente el campo de la tabla?
  


rst.Close
Set rst = Nothing

End Sub

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5704
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 16:54
Como que te falta hacer todo ya tienes el recordset te vas al primer registro y tienes que tener un campo para rellenar dentro del bucle y guardar el Resultado en él, actualizar la tabla, ir al siguiente registro, etc....

Saludos.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 17:08
Con todo respeto el código de Mihura lo has metido con calzador en un procedimiento que no veo yo muy fino...
Sub Mihura()

Dim rst As DAO.Recordset
Dim Xs As String

Set rst = CurrentDb.OpenRecordset("Select * from Tabla1")
If rst.EOF Then Exit Sub
 
Do Until rst.EOF
    Xs = Replace(rst!Descripciones, "MANDATORY GAGE ", "")
    Xs = Replace(Xs, "OPTIONAL INSPECTION GAGE ", "")
    Xs = Replace(Xs, "OPTIONAL INSPECTION ", "")
    rst.Edit
    rst!Extraer = Split(Xs, " ")(0)
    rst.Update
    rst.MoveNext
Loop

rst.Close
Set rst = Nothing

End Sub

Consejo (de buen rollo): analiza cada una de las lineas de código que te hemos dado (en cualquiera de las opciones) para entender que hace cada una de ellas. De esa forma verás que lo que haces en tu "mezclado" no tiene coherencia.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 18/Septiembre/2019 a las 20:24
Una mas tomando la idea de Mihura:

SELECT Tabla1.Descripciones, IIf([Descripciones] Like "*GAGE*",Replace([Descripciones],"OPTIONAL INSPECTION ","")) AS r1, IIf([r1] Like "*GAGE*",Replace([r1],"MANDATORY GAGE ","")) AS r2, IIf([Descripciones] Like "*GAGE*",Replace([r2]," IS REQUIRED PER PLANT'S SPECIFIC WORK INSTRUCTIONS","")) AS r3, IIf([Descripciones] Like "*GAGE*",Replace([r3]," PER PLANT'S SPECIFIC WORK INSTRUCTIONS","")) AS r4, IIf([Descripciones] Like "*GAGE*",Replace([r4]," IS REQUIRED PER PLANT'S SPEC. WORK INST.","")) AS r5
FROM Tabla1;

rst!Extraer = Split(Xs, " ")(0), me esta devolviendo null y me lanza este error:
Error9, SubScript out of range

La ayuda de access menciona que "Usted declaró una matriz pero no especificó el número de elementos."
Ha hecho referencia a un miembro de la colección inexistente. Intente usar la construcción For Each ... Next en lugar de especificar elementos de índice.

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable