Extraer codigo
- Jaime Franco Jimenez
- 9 mar 2024
- 5 Min. de lectura
Para el siguiente ejemplo, tenemos una serie de cadenas.
Debemos de extraer cadenas de caracteres alfabetos y números de dos dígitos si el alfabeto y los números de dos dígitos están separados por un carácter especial.
Por ejemplo, ABY$491 = Y49
Empecemos…
En la celda B2, usamos LET, creamos una variable, usamos la funcion EXTRAE, como argumento texto, ponemos la celda A2, como argumento posición inicial, usamos SECUENCIA, como argumento filas, usamos LARGO, como argumento numero de caracteres, ponemos 1.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);a)
Hemos extraído cada carácter de la celda A2.
Creamos otra variable, usamos la funcion BYROW, como argumento array, usamos la funcion CODIGO, como argumento ponemos la variable “a”, como argumento funcion, ponemos LAMBDA, declaramos una variable, usamos el operador lógico Y, como argumento valor logico1, ponemos la variable “x”, comparamos con mayor o igual a 65, 65 es el código ASCII de la letra A, como argumento valor logico2, volvemos a poner la variable “x”, y, comparamos con menor o igual a 90, 90 es el código ASCII de la letra Z, es decir, vamos a averiguar si cada letra de la celda A2 es una letra mayúscula.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));b)
Tenemos una matriz desbordada en vertical, donde aparece VERDADERO donde es una letra mayúscula, y, FALSO donde no lo es.
Creamos otra variable, usamos la funcion SECUENCIA, como argumento filas, usamos la funcion CONTARA como argumento valor1, ponemos la variable “b”.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));c)
Obtenemos una secuencia desde el numero 1 hasta el numero 6 para la celda A2.
¿Por qué hacemos esto?
Porque no podemos usar la funcion FILA de forma matricial, usaría la funcion FILA para obtener la posición de las letras mayúsculas, pero, con la funcion SECUENCIA la vamos a obtener igualmente, la diferencia, es que la funcion FILA, devuelve la posición física, es decir, si hay coincidencia en la fila 7, nos devuelve la fila 7, pero, al usar la funcion SECUENCIA, nos devuelve la posición dentro de la matriz.
Creamos otra variable, usamos la funcion ENFILA, como argumento matriz, usamos el condicional SI, como argumento prueba lógica, preguntamos si la variable “b” es igual a VERDADERO, como argumento valor si verdadero, ponemos la variable “c”, como argumento valor si falso, ponemos un error.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);d)
Obtenemos la posición de las letras mayúsculas en horizontal.
Creamos otra variable, usamos la funcion REDUCE, como argumento valor inicial, ponemos blanco, como argumento array, ponemos la variable “d”, como argumento funcion, ponemos LAMBDA, y, declaramos dos variables.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;REDUCE("";d;LAMBDA(x;y
Como argumento calculo de LAMBDA, usamos la funcion APIALRH, como argumento matriz1, ponemos la variable “x”, como argumento matriz2, usamos la funcion INDICE, como argumento matriz, ponemos la variable “a”, como argumento numero de fila, usamos la funcion SECUENCIA, como argumento filas, ponemos 4, porque entra la letra mayúscula, el símbolo, y, los dos dígitos, ocupan cuatro posiciones, omitimos el argumento columnas, como argumento inicio, ponemos la variable “y”. omitimos el argumento número de columna.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));e)
Para la celda A2, obtenemos una matriz desbordada de cuatro columnas, donde hemos rescatado las filas de la variable “d”, es decir, cuatro posiciones desde cada letra mayúscula.
La primera columna está de más, usamos la funcion EXCLUIR, como argumento matriz, es la funcion REDUCE, omitimos el argumento filas, como argumento columnas, ponemos 1.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);e)
Creamos otra variable, usamos la funcion FILTRAR, como argumento array, ponemos la variable “e”, como Include, usamos la funcion ESNUMERO, como argumento usamos la funcion TOMAR, como argumento matriz, ponemos la variable “e”, como argumento filas, ponemos -1, y, multiplicamos por 1, de esta manera, vamos a obtener solo el código.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));f)
Para que se cumpla la condición, el segundo carácter debe de ser un símbolo, y, el tercer carácter un número, creamos otra variable, vamos a trabajar con el código de la segunda y tercera fila, ponemos MAP, como argumento matriz, usamos la funcion CODIGO, como argumento texto, usamos la funcion ELEGIRFILAS, como argumento matriz, ponemos la variable “e”, como argumento numero de fila1, ponemos 2, como argumento numero de fila2, ponemos 3, y, cerramos paréntesis.
=SI.ERROR(MAP(A2:A10;LAMBDA(x;LET(a;EXTRAE(x;SECUENCIA(LARGO(x));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3))
Como argumento funcion, ponemos LAMBDA, y, declaramos una variable, como argumento calculo de LAMBDA, ponemos el doble signo negativo, abrimos un paréntesis, usamos el operador lógico O, como argumento valor logico1, usamos el operador lógico Y, como argumento valor logico1 del operador lógico Y, ponemos la variable “x”, comparamos con mayor o igual a 65, como argumento valor logico2 del operador lógico Y, volvemos a poner la variable “x”, y, comparamos con menor o igual a 90, como argumento valor logico2 del operador lógico O, ponemos otro operador lógico Y, como argumento valor logico1 del segundo operador lógico Y, ponemos la variable “x”, comparamos con mayor o igual a 48, como argumento valor logico2 del segundo operador lógico Y, preguntamos si la variable “x” es menor o igual a 57, cerramos paréntesis.
Es decir, estamos preguntando si algún valor de la segunda o tercera fila de la variable “e” es una letra mayúscula, o, un número.
=SI.ERROR(MAP(A2:A10;LAMBDA(x;LET(a;EXTRAE(x;SECUENCIA(LARGO(x));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3));LAMBDA(x;--(O(Y(x>=65;x<=90);Y(x>=48;x<=57)))));g)
Para la celda A2, obtenemos una matriz desbordada de dos filas y una columna, con 0 donde no es ni mayúsculas, ni número, y, 1, donde es mayúsculas o número.
Creamos otra variable, usamos el condicional SI, como argumento prueba lógica, usamos la funcion TOMAR, como argumento matriz, ponemos la variable “f”, como argumento filas, ponemos 1, e, igualamos a 0.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3));LAMBDA(x;--(O(Y(x>=65;x<=90);Y(x>=48;x<=57)))));h;SI(TOMAR(g;1)=0
Como argumento valor si verdadero, ponemos otro condicional SI, como argumento prueba lógica, volvemos a usar la funcion TOMAR, como argumento matriz, ponemos la variable “f”, como argumento filas, ponemos -1, e, igualamos a 1.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3));LAMBDA(x;--(O(Y(x>=65;x<=90);Y(x>=48;x<=57)))));h;SI(TOMAR(g;1)=0;SI(TOMAR(g;-1)=1
Como argumento valor si verdadero del segundo SI, ponemos la variable “e”, como argumento valor si falso del segundo SI, ponemos blanco, como argumento valor si falso del primer SI, ponemos otro blanco.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3));LAMBDA(x;--(O(Y(x>=65;x<=90);Y(x>=48;x<=57)))));h;SI(TOMAR(g;1)=0;SI(TOMAR(g;-1)=1;f;"");"");h)
Obtenemos una matriz desbordada con el código.
Creamos otra variable, usamos la funcion BYROW, como argumento array, transponemos la variable “g”, como argumento funcion, ponemos LAMBDA, declaramos una variable, y, concatenamos dicha variable.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3));LAMBDA(x;--(O(Y(x>=65;x<=90);Y(x>=48;x<=57)))));h;SI(TOMAR(g;1)=0;SI(TOMAR(g;-1)=1;f;"");"");i;BYROW(TRANSPONER(h);LAMBDA(x;CONCAT(x)));i)
Tenemos el código unido.
Usamos el argumento calculo de LET, usamos la funcion UNIRCADENAS, como argumento delimitador, ponemos coma, y, dejamos un espacio, ignoramos celdas vacías, como argumento texto1, usamos la funcion IZQUIERDA, como argumento texto, ponemos la variable “i”, omitimos el argumento numero de caracteres, por lo que tomara 1 carácter por la izquierda, concatenamos con la funcion DERECHA, como argumento texto, ponemos la variable “i”, como argumento numero de caracteres, ponemos 2, para tomar solo los dígitos.
=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3));LAMBDA(x;--(O(Y(x>=65;x<=90);Y(x>=48;x<=57)))));h;SI(TOMAR(g;1)=0;SI(TOMAR(g;-1)=1;f;"");"");i;BYROW(TRANSPONER(h);LAMBDA(x;CONCAT(x)));UNIRCADENAS(",";VERDADERO;IZQUIERDA(i)&DERECHA(i;2)))
Ya tenemos solo el código.
Ahora, vamos a convertir la expresión en matricial, que lo haremos igual que para el ejemplo anterior, por lo que después del signo igual, ponemos MAP, como argumento array, seleccionamos el rango A2:A10, como argumento LAMBDA, ponemos LAMBDA, declaramos una variable, como argumento cálculo de LAMBDA, es la expresión que tenemos, y, sustituimos A2 por el nombre de la variable.
=MAP(A2:A10;LAMBDA(x;LET(a;EXTRAE(x;SECUENCIA(LARGO(x));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3));LAMBDA(x;--(O(Y(x>=65;x<=90);Y(x>=48;x<=57)))));h;SI(TOMAR(g;1)=0;SI(TOMAR(g;-1)=1;f;"");"");i;BYROW(TRANSPONER(h);LAMBDA(x;CONCAT(x)));UNIRCADENAS(",";VERDADERO;IZQUIERDA(i)&DERECHA(i;2)))))
Tenemos un error donde no hay código que extraer, por lo usamos la funcion SI.ERROR, y, ponemos blanco donde hay error.
=SI.ERROR(MAP(A2:A10;LAMBDA(x;LET(a;EXTRAE(x;SECUENCIA(LARGO(x));1);b;BYROW(CODIGO(a);LAMBDA(x;Y(x>=65;x<=90)));c;SECUENCIA(CONTARA(b));d;ENFILA(SI(b;c;NOD());3);e;EXCLUIR(REDUCE("";d;LAMBDA(x;y;APILARH(x;INDICE(a;SECUENCIA(4;;y)))));;1);f;FILTRAR(e;ESNUMERO(TOMAR(e;-1)*1));g;MAP(CODIGO(ELEGIRFILAS(f;2;3));LAMBDA(x;--(O(Y(x>=65;x<=90);Y(x>=48;x<=57)))));h;SI(TOMAR(g;1)=0;SI(TOMAR(g;-1)=1;f;"");"");i;BYROW(TRANSPONER(h);LAMBDA(x;CONCAT(x)));UNIRCADENAS(",";VERDADERO;IZQUIERDA(i)&DERECHA(i;2)))));"")
Aceptamos, y, ya lo tenemos.
Miguel Angel Franco
Comments