top of page

Extraer cadenas de textos y numeros

En el ejemplo anterior, separamos cada cadena donde el delimitador era cada letra mayúscula.




Ahora, tenemos el mismo ejemplo, pero al final se ha añadido un precio.





Cuando el numero tiene decimales, es separado por coma, por ejemplo, 2,34.


El código del número 0 es el código 48, el número 1, es el código 49, el numero 9 es el código 57, es decir, los números van desde el código 48 al 57 (0-9).


El código de la coma es el código 44, por si acaso, el código del punto es el código 46.


Aunque la expresión va a ser muy parecida a la del ejemplo anterior, vamos a comenzar desde cero.


Esta es la expresión que usamos para el ejemplo anterior.


=DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(EXTRAE(A2;SECUENCIA(LARGO(A2));1));LAMBDA(x;SI(Y(x>=65;x<=90);"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ")


Vamos a modificarla un poco, ponemos LET, creamos una variable (a), y, almacenamos la expresión EXTRAE.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1)


Creamos otra variable (b), almacenamos la expresión del ejemplo anterior, pero, sustituimos la función EXTRAE por la variable “a”.


Como argumento nombre3, ponemos la variable “b” para probar que el resultado es correcto.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(Y(x>=65;x<=90);"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");b)


Aceptamos, y, tenemos el mismo resultado del ejemplo anterior.




Debemos de modificar la expresión de la variable “b” para que contemple los números, para ello, vamos al argumento prueba lógica del condicional SI, ponemos el operador lógico O, como argumento valor logico1, ponemos el operador lógico Y, donde preguntamos si la variable “x” es mayor o igual a 65, y, menor o igual a 90, es decir, es una letra mayúscula, como argumento valor logico2, preguntamos si la variable “x” es mayor o igual a 48 y menor o igual a57, es decir, es un numero entre 0 y 9, cerramos paréntesis del operador lógico Y, y, del operador lógico O.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");b)


Aceptamos, y, vemos como los números han sido separados, pero la coma, esta pegada al primer número.




Porque no hemos preguntado por el código de la coma, volvemos al argumento prueba lógica del condicional SI, vamos al operador lógico O, añadimos el argumento valor logico3, y, preguntamos si la variable “x” es igual a 44, que es el código de la coma.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);x=44);"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");b)


Si queremos incorporar también la coma, pues, cambiamos el argumento valor logico3, igual que antes, incorporamos el operador lógico Y.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);Y(x>=44;x<=46));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");b)


Hasta este momento, hemos creado dos variables, la variable “a” que contiene cada carácter de la cadena, y, la variable “b” donde tenemos separada cada cadena.


Debemos de centrarnos en los números, que es donde debemos de realizar la operación, porque la separación de cadenas en texto ya lo tenemos, pero, en la variable “b” solo deben de aparecer las cadenas de texto, para ello, creamos otra variable, “c”, vamos a filtrar dicha expresión con la función FILTRAR, como argumento array es la variable “b”, como argumento include, abrimos un paréntesis para poner una primera condición, dicha condición es que el código de la variable “b” debe de ser mayor o igual a 65, cerramos paréntesis, ponemos el símbolo de asterisco, abrimos otro paréntesis para la segunda condición, donde preguntamos si el código de la variable “b” es menor o igual a 90.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);Y(x>=44;x<=46));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");c;FILTRAR(b;(CODIGO(b)>=65)*(CODIGO(b)<=90));c)





Creamos otra variable, donde usamos la función BYROW, como argumento array es la variable “a”, es decir, cada carácter del valor de la celda A2, como argumento función, ponemos LAMBDA, declaramos una variable que almacena el argumento array, volvemos a usar el operador lógico O, como argumento valor logico1, usamos el operador lógico Y, donde preguntamos si la variable “y” es mayor o igual a 44 y menor o igual a 46, como argumento valor logico2, preguntamos si la variable y es mayor o igual a 48, y, menor o igual a 57.


Cerramos paréntesis.


Como argumento nombre5, ponemos la variable “d”.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);Y(x>=44;x<=46));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");c;FILTRAR(b;(CODIGO(b)>=65)*(CODIGO(b)<=90));d;BYROW(a;LAMBDA(y;O(Y(CODIGO(y)>=44;CODIGO(y)<=46);Y(CODIGO(y)>=48;CODIGO(y)<=57))));d)


Aceptamos, y, tenemos una matriz desbordada en vertical con FALSO donde no hay coincidencia, y, VERDADERO donde la hay.













Creamos otra variable, “e”, donde filtramos la variable “a”, siempre que la variable “d” sea igual a VERDADERO.


Como argumento nombre6, ponemos la variable “e”.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);Y(x>=44;x<=46));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");c;FILTRAR(b;(CODIGO(b)>=65)*(CODIGO(b)<=90));d;BYROW(a;LAMBDA(y;O(Y(CODIGO(y)>=44;CODIGO(y)<=46);Y(CODIGO(y)>=48;CODIGO(y)<=57))));e;FILTRAR(a;d=VERDADERO);e)


Obtenemos los números, incluido la coma.









Concatenamos la función FILTRAR.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);Y(x>=44;x<=46));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");c;FILTRAR(b;(CODIGO(b)>=65)*(CODIGO(b)<=90));d;BYROW(a;LAMBDA(y;O(Y(CODIGO(y)>=44;CODIGO(y)<=46);Y(CODIGO(y)>=48;CODIGO(y)<=57))));e;CONCAT(FILTRAR(a;d=VERDADERO));e)


Delante de CONCAT ponemos la función ABS para convertir el valor en formato de número.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);Y(x>=44;x<=46));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");c;FILTRAR(b;(CODIGO(b)>=65)*(CODIGO(b)<=90));d;BYROW(a;LAMBDA(y;O(Y(CODIGO(y)>=44;CODIGO(y)<=46);Y(CODIGO(y)>=48;CODIGO(y)<=57))));e;ABS(CONCAT(FILTRAR(a;d=VERDADERO)));e)


Usamos la función APILARH en el argumento nombre6, como argumento matriz1, es la variable “c”, como argumento matriz2, es la variable “e”, cerramos paréntesis.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);Y(x>=44;x<=46));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");c;FILTRAR(b;(CODIGO(b)>=65)*(CODIGO(b)<=90));d;BYROW(a;LAMBDA(y;O(Y(CODIGO(y)>=44;CODIGO(y)<=46);Y(CODIGO(y)>=48;CODIGO(y)<=57))));e;ABS(CONCAT(FILTRAR(a;d=VERDADERO)));APILARH(c;e))


Aceptamos, y, ya lo tenemos.


Podemos añadir el argumento matriz3 a la función APILARH, y, entre comillas dobles, ponemos el símbolo de euro.


=LET(a;EXTRAE(A2;SECUENCIA(LARGO(A2));1);b;DIVIDIRTEXTO(ESPACIOS(SUSTITUIR(UNIRCADENAS("";VERDADERO;BYROW(CODIGO(a);LAMBDA(x;SI(O(Y(x>=65;x<=90);Y(x>=48;x<=57);Y(x>=44;x<=46));"/"&CARACTER(x);CARACTER(x)))));"/";" "));" ");c;FILTRAR(b;(CODIGO(b)>=65)*(CODIGO(b)<=90));d;BYROW(a;LAMBDA(y;O(Y(CODIGO(y)>=44;CODIGO(y)<=46);Y(CODIGO(y)>=48;CODIGO(y)<=57))));e;ABS(CONCAT(FILTRAR(a;d=VERDADERO)));APILARH(c;e;"€"))


Aceptamos y, arrastramos, vemos que todos los valores numéricos han sido extraídos correctamente.







Miguel Angel Franco

 
 
 

Comentarios


© 2019 Miguel Ángel Franco García

bottom of page