martes, 6 de noviembre de 2018

Extraer info de una cadena de texto

En una reciente formación me plantearon un problema con el que se encontraban en su día a día...
Trabajaban con unas matriculas sin un patrón claro.. solo tenían seguro que hay 1,2 o 3 letras al inicio, seguidos de varios dígitos,
y finaliza con otras 1,2 o 3 letras; por ejemplo:
M1234PK
MJ12345P
MJ123456PK
MJA1234567PK
MJ123PKK
MJA12PKK

Extraer info de una cadena de texto



El objetivo del ejercicio es recuperar la parte inicial y final de las matrículas, que corresponden a los caracteres de texto, en cualquier caso.

Lo primero que haremos es escribir la secuencia numérica básica 0,1,2,3,4,5,6,7,8 y 9 en un rango H1:H10 y le asignaremos un nombre definido que llamaré 'digitos'
digitos =Hoja1!$H$1:$H$10

Esto facilitará la explicación.


Si nuestras matrículas se encuentran en el rango B2:B7, para recuperar el inicio de la matrícula en la celda C2 escribiremos y ejecutaremos matricialmente (presionando Ctrl+Mayusc+Enter):
=IZQUIERDA(B2;MIN(SI.ERROR(ENCONTRAR(digitos;B2);LARGO(B2)))-1)

De igual forma para recuperar la parte final de la matricúla en D2 escribiremos y ejecutaremos matricialmente (presionando Ctrl+Mayusc+Enter):
=DERECHA(B2;LARGO(B2)-MAX(SI.ERROR(ENCONTRAR(digitos;B2);0)))


La explicación de estas fórmulas se basa en el comportamiento matricial de la función ENCONTRAR, que localiza la posición dentro de la matrícula de los dígitos; por ejemplo ENCONTRAR(digitos;B2), siendo B2= M1234PK , devuelve la matriz:
{#¡VALOR!;2;3;4;5;#¡VALOR!;#¡VALOR!;#¡VALOR!;#¡VALOR!;#¡VALOR!}

es decir, nos indica que los valores numéricos están en la posición 2, 3, 4 y 5; mientras que los demás son valores tipo texto.
Aprovechándonos del error devuelto, gestionamos con la función SI.ERROR para 'cambiar los errores' por el número total de caracteres.
SI.ERROR(ENCONTRAR(digitos;B2);LARGO(B2))
La matriz ahora será:
{7;2;3;4;5;7;7;7;7;7}

Ahora recuperamos el valor mínimo, que devuelve obviamente el primer caracter numérico, en el ejemplo el segundo caracter.
MIN(SI.ERROR(ENCONTRAR(digitos;B2);LARGO(B2)))-1

Finalmente aplicamos IZQUIERDA para extraer el inicio de la matrícula.


De forma análoga operamos para obtener el final de la matrícula.
ENCONTRAR localiza la posición dentro de la matrícula de los dígitos; por ejemplo ENCONTRAR(digitos;B2), siendo B2= M1234PK , devuelve la matriz:
{#¡VALOR!;2;3;4;5;#¡VALOR!;#¡VALOR!;#¡VALOR!;#¡VALOR!;#¡VALOR!}

es decir, nos indica que los valores numéricos están en la posición 2, 3, 4 y 5; mientras que los demás son valores tipo texto.
Aprovechándonos del error devuelto, gestionamos con la función SI.ERROR para 'cambiar los errores' por ceros.
SI.ERROR(ENCONTRAR(digitos;B2);0)
La matriz ahora será:
{0;2;3;4;5;0;0;0;0;0}

Ahora recuperamos el valor máximo, que devuelve obviamente el primer caracter numérico, en el ejemplo el segundo caracter.
MAX(SI.ERROR(ENCONTRAR(digitos;B2);0))

Finalmente aplicamos DERECHA para extraer el final de la matrícula.


Como se puede comprobar para los distintos casos listados en B2:B7, las fórmulas retornan los valores deseados...

1 comentario:

Nota: solo los miembros de este blog pueden publicar comentarios.