Access - Hallar un código dentro de una cadena de caracteres variable

 
Vista:

Hallar un código dentro de una cadena de caracteres variable

Publicado por Victor (4 intervenciones) el 06/05/2016 22:09:04
Hola! Es mi primera consulta en el foro. Estuve buscando acá y en otros lados pero no conseguí respuesta a mi problema, que explico:
Tengo una tabla en Access con un campo "Título" cuya única restricción es un largo de 185 caracteres. Dentro de este campo, donde pueden escribir cualquier cosa, necesito identificar unos códigos con formato AB123 (dos letras + 3 dígitos) o A1234 (1 letra + 4 dígitos). En un mismo título pueden venir varios códigos uno tras otro (tipo AB234 - AC234 - AD234). Necesito crear una tabla nueva, con un campo Código con un registro por cada código hallado. Entiendo que Access tiene funciones para, dado un formato general, encontrar las cadenas que se corresponden con ese formato dentro de otra cadena, pero no hallé la forma de usarlas.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Hallar un código dentro de una cadena de caracteres variable

Publicado por Enrique Heliodoro (1664 intervenciones) el 07/05/2016 01:22:55
Dado que no hay un referente concreto ( ... un campo "Título" cuya única restricción es un largo de 185 caracteres. Dentro de este campo, donde pueden escribir cualquier cosa...) una posible vía de solución podría ir de la mano de dividir esa cadena en sus partes con la función SPLIT y tras ello analizar los resultados obtenidos.

Una de las (supuestas) reglas que tienen que cumplir seria la longitud (cinco caracteres) y el resto .... habría que adaptarse a los datos reales.

Hay una variedad de funciones de texto que permiten muchas formas de enfocar la posible solución, aunque la ideal seria .... aplicar un poco de orden (así se evitarían falsos positivos, lo que redundaría en mas fiabilidad en el conjunto).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hallar un código dentro de una cadena de caracteres variable

Publicado por Victor (4 intervenciones) el 09/05/2016 15:11:57
Claro, había pensado en hacer un módulo que con la función trim (o split como me dices) tomara primero los caracteres del 1 al 5, luego del 2 al 6, luego del 3 al 7 y así. Y verificar si cada parte de texto que toma cumple con el formato que vengo buscando. Bueno, esa comparación para poder ver si el formato de dos letras y tres dígitos se cumple, cómo podría hacerse?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Hallar un código dentro de una cadena de caracteres variable

Publicado por Enrique Heliodoro (1664 intervenciones) el 09/05/2016 18:16:22
Sospecho que tu curiosidad no te ha llevado a leer algo sobre Split (y por ello lo mezclas con Trim que no tiene nada que ver).

para poder aportar algo mas concreto haría falta una muestra (real) de los datos, pues no es lo mismo localizar ABCX en un texto con este formato:
23123123123123 ABCX 3423423423423
Que en un texto con este formato
13123123123ABCX3412412423423

(los nueros no significan nada, solo son caracteres diferentes a los alfabéticos del ejemplo)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hallar un código dentro de una cadena de caracteres variable

Publicado por Victor (4 intervenciones) el 10/05/2016 22:23:58
Gracias. Me apuré en contestar y efectivamente todavía no había visto bien cómo funciona Split, realmente es lo que estoy necesitando.
Conseguí un procedimiento que reemplaza caracteres y llegué a dejar los datos separados por guiones. Con Split teóricamente puedo obtener una matriz de, digamos, hasta 20 campos (en mi caso), donde acomodar los datos que vienen más o menos así:
"F.O.-ACC RB CLR - C0216 - ARCF9371 - WC0216 - AZOPARDO 670 CABA - NG - OFFLANDING" o
"F.O.-ACC RB CLR - BS100 - ARBA7568 - WBS100 - LBS100 - CALLE 48 S -N Y CALLE 138 - LTA" o
"FO Acc RB-CLR S.A. - RED DE ACCESO - -WKS175 - WKS194 - DESPLIEGUE 2011"
Los datos que tengo que identificar son los que inician con las letras G, C, D, W, V, Y, U, L o M, y tienen formatos de 2 letras y 4 dígitos, o 3 letras y 3 dígitos. En los ejemplos que puse, serían WC0216, WBS100, LBS100, WKS175, WKS194. Tampoco pude hacer trabajar la función Split sobre este texto con guiones para llegar a una tabla donde dejara todos los datos a fin de posteriormente revisar si cumplen o no con el formato mencionado. Encontré un módulo que supuestamente me iba a armar esa tabla pero no funciona, falla en la propia linea de Split.
De todos modos esta es la parte menos urgente, porque aunque no es una solución elegante, puedo usar una hoja Excel y con Texto en Columnas llegar a la dichosa matriz, y volverla a pasar al Access.

La parte importante es cómo podría, partiendo de esta matriz donde conseguí separar el campo de texto en varios campos, llegar a una tabla de dos campos: Un identificador numérico que ya viene en la tabla original, y el campo que podemos llamar Código con estos datos tipo WC0216 o LBS100. En el tercer ejemplo, donde vienen dos códigos, en esta tabla final deberían ir los dos asociados al mismo identificador numèrico.

De nuevo, muchas gracias por su atención.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Hallar un código dentro de una cadena de caracteres variable

Publicado por Enrique Heliodoro (1664 intervenciones) el 11/05/2016 14:27:30
La función Split no exige un carácter de separación especifico, es mas 'por defecto' utiliza el espacio y el espacio es un marcador optimo 'si se utiliza en ese contexto' (por eso lo de 'muestras reales') porque permitiría separar la silabas para su tratamiento posterior (longitud, etc. ...)

No creo necesario el utiizar medios externos para tratar las cadenas de texto, dudo que Excel disponga de mejores herramientas que Access, solo seria útil en función de la particular experiencia del usuario, pero si el usuario es taln hábil con Excel, metese en el mismo lio con Access me parece una decisión errónea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hallar un código dentro de una cadena de caracteres variable

Publicado por Victor (4 intervenciones) el 18/08/2016 22:00:40
Volví para dejar una respuesta sobre este problema, por si a alguien le resulta útil. Mi torpeza no me permitió conseguir ningún resultado en Access, de hecho la función Split no me ayudó en nada, porque no encontré la forma de aprovecharla. De todos modos, tener separada en subcadenas la cadena original hubiera sido sólo el principio del proceso, después me faltaba identificar si cada subcadena encajaba o no con el formato que venía buscando.

Finalmente alguien me pasó una macro en Excel, que usa la herramienta "Expresiones Regulares". Incluso me dejó un tutorial (http://www.codeproject.com/Articles/9099/The-Minute-Regex-Tutorial)

La solución a mi problema está en estas líneas:
-----------------------------------
1
2
3
4
5
6
7
Sub extraeGrupos(): Dim celda As Range, series As Object, n As Integer
  Application.ScreenUpdating = False: With CreateObject("vbscript.regexp")
    .Global = True: .IgnoreCase = False: .Pattern = "\b[CDGLMVYUW]{1}[A-Z]{2}\d{3}\b"
    For Each celda In Range("b2:b5") ' <= adapta a tu rango real '
      If Not .Test(celda) Then GoTo siguiente Else Set series = .Execute(celda)
      For n = 1 To series.Count: celda.Offset(, n) = series(n - 1): Next: Set series = Nothing
siguiente: Next: End With: End Sub
-------------------------------------
No es lo más prolijo hacer parte de un proceso en Access, luego copiar y llevar todo a Excel, correr la mencionada macro y volver a trasladar los resultados a Access para continuar haciendo consultas, pero bueno, lo importante es que funciona. Caverna Style.

La clave está en la linea

1
Pattern = "\b[CDGLMVYUW]{1}[A-Z]{2}\d{3}\b"

que identifica la primera letra del código, y el formato de dos letras más y luego tres dígitos. Entonces extrae ese código en una celda aparte. Si en la misma línea hay más de un código, usa tantas celdas como códigos encuentre. Es exactamente lo que necesitaba.

No encontrá la forma de replicar en Access esa macro, de modo de hacer todo en forma elegante, con un único programa. Supongo que debe haber forma de compatibilizarla, pero no es prioritario para nada. En algún momento libre le voy a buscar la vuelta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar