Al hilo de la entrada anterior sobre VBScript.RegExp donde exponía algunos ejemplos de 'Regular Expressions' donde recuperar/extraer partes de una cadena de texto (con el método .Execute) o eliminar/sustituirlas con el método .Replace del objeto mencionado, algunos lectores me han preguntado cómo se podría llegar al mismo resultado empleando formulación estándar...
Como es bien sabido, me encanta obtener fórmulas 'fáciles' que procesen la información hasta cumplir objetivos... y me puse a trabajar.
Por supuesto la solución propuesta no es única y hay alguna posibilidad más...
Vamos con la primera fórmula, la sencilla, que replicaría el comportamiento de .Execute. Así en mi celda E15 y trabajando sobre la cadena de texto de D15:
=LET(cadena;D15; delimitadorINI;"i"; delimitadorFIN;"f"; elementos;TRANSPONER(XMLFILTRO("<i><f><d>"&SUSTITUIR(cadena;delimitadorINI;"</d><d>")&"</d></f></i>";"//f/d")); recomposicion;delimitadorINI&(IZQUIERDA(elementos;ENCONTRAR(delimitadorFIN;elementos)-1))&delimitadorFIN; FILTRAR(recomposicion;NO(ESERROR(recomposicion))))
Comprobamos como nos aprovechamos del uso de la función LET para construir una secuencia de pasos donde tratamos la cadena de texto original...
A partir de las tres variables:
- cadena
- delimitadorINI
- delimitadorFIN
aplicamos la ya conocida función XMLFILTRO y su funcionalidad para separar textos
Para 'recomponer' con los delimitadores de inicio y fin, y poder recuperar solo los que nos interesan con la función FILTRAR.
. Es decir, con: recomposicion;delimitadorINI&(IZQUIERDA(elementos;ENCONTRAR(delimitadorFIN;elementos)-1))&delimitadorFIN;
obtendríamos un vector del tipo:
#¡VALOR! i100f i110f i200f
haciendos necesario en el paso siguiente quitar el 'error':
FILTRAR(recomposicion;NO(ESERROR(recomposicion))))
Quedándonos exclusivamente con los elementos o partes del texto que cumplen la condición de estar entre los delimitadores...
La segunda fórmula (se asemeja a .Replace) trabaja de manera inversa... queremos mantener el resto de la cadena de texto original, excepto lo que esté entre los delimitadores.
Así en la celda E18 y trabajando sobre la celda que contiene la cadena de texto en D15 :
=LET(cadena;D15; delimitadorINI;"i"; delimitadorFIN;"f"; elementos;TRANSPONER(XMLFILTRO("<i><f><d>"&SUSTITUIR(cadena;delimitadorINI;"</d><d>")&"</d></f></i>";"//f/d")); recomposicion;SI.ERROR(DERECHA(elementos;LARGO(elementos)-ENCONTRAR(delimitadorFIN;elementos)); elementos); eltosAmantener;FILTRAR(recomposicion;NO(ESERROR(elementos))); UNIRCADENAS("";VERDADERO;eltosAmantener))
Nota las diferencias en los últimos pasos con la fórmula previa... donde la recomposición se genera de forma complementaria, y terminamos empleando la función UNIRCADENAS para concatenar el vector resultante
SUMA( ; ; )/
ATENCIÖN!!... un aspecto fundamental será la elección de los delimitadores de inicio y fin...
usar caracteres poco frecuentes como {}, [], <> son siempre muy buena idea.
Sin duda algo más elaborado que el método aplicado con VBA ;-)
En su caso, cuando Microsoft libere o lance finalmente la función LAMBDA para todo el mundo, facilitará algo estos procesos.. al permitirnos y facilitarnos la recursividad.
Como es bien sabido, me encanta obtener fórmulas 'fáciles' que procesen la información hasta cumplir objetivos... y me puse a trabajar.
Por supuesto la solución propuesta no es única y hay alguna posibilidad más...
Vamos con la primera fórmula, la sencilla, que replicaría el comportamiento de .Execute. Así en mi celda E15 y trabajando sobre la cadena de texto de D15:
=LET(cadena;D15; delimitadorINI;"i"; delimitadorFIN;"f"; elementos;TRANSPONER(XMLFILTRO("<i><f><d>"&SUSTITUIR(cadena;delimitadorINI;"</d><d>")&"</d></f></i>";"//f/d")); recomposicion;delimitadorINI&(IZQUIERDA(elementos;ENCONTRAR(delimitadorFIN;elementos)-1))&delimitadorFIN; FILTRAR(recomposicion;NO(ESERROR(recomposicion))))
Comprobamos como nos aprovechamos del uso de la función LET para construir una secuencia de pasos donde tratamos la cadena de texto original...
A partir de las tres variables:
- cadena
- delimitadorINI
- delimitadorFIN
aplicamos la ya conocida función XMLFILTRO y su funcionalidad para separar textos
Para 'recomponer' con los delimitadores de inicio y fin, y poder recuperar solo los que nos interesan con la función FILTRAR.
. Es decir, con: recomposicion;delimitadorINI&(IZQUIERDA(elementos;ENCONTRAR(delimitadorFIN;elementos)-1))&delimitadorFIN;
obtendríamos un vector del tipo:
#¡VALOR! i100f i110f i200f
haciendos necesario en el paso siguiente quitar el 'error':
FILTRAR(recomposicion;NO(ESERROR(recomposicion))))
Quedándonos exclusivamente con los elementos o partes del texto que cumplen la condición de estar entre los delimitadores...
La segunda fórmula (se asemeja a .Replace) trabaja de manera inversa... queremos mantener el resto de la cadena de texto original, excepto lo que esté entre los delimitadores.
Así en la celda E18 y trabajando sobre la celda que contiene la cadena de texto en D15 :
=LET(cadena;D15; delimitadorINI;"i"; delimitadorFIN;"f"; elementos;TRANSPONER(XMLFILTRO("<i><f><d>"&SUSTITUIR(cadena;delimitadorINI;"</d><d>")&"</d></f></i>";"//f/d")); recomposicion;SI.ERROR(DERECHA(elementos;LARGO(elementos)-ENCONTRAR(delimitadorFIN;elementos)); elementos); eltosAmantener;FILTRAR(recomposicion;NO(ESERROR(elementos))); UNIRCADENAS("";VERDADERO;eltosAmantener))
Nota las diferencias en los últimos pasos con la fórmula previa... donde la recomposición se genera de forma complementaria, y terminamos empleando la función UNIRCADENAS para concatenar el vector resultante
SUMA( ; ; )/
ATENCIÖN!!... un aspecto fundamental será la elección de los delimitadores de inicio y fin...
usar caracteres poco frecuentes como {}, [], <> son siempre muy buena idea.
Sin duda algo más elaborado que el método aplicado con VBA ;-)
En su caso, cuando Microsoft libere o lance finalmente la función LAMBDA para todo el mundo, facilitará algo estos procesos.. al permitirnos y facilitarnos la recursividad.
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.