jueves, 25 de febrero de 2021

Caracteres UNICODE PQ vs Fórmula

Recientemente tuve que realizar una serie de búsquedas exactas y el problema me exigió emplear en la comparativa la función UNICODE, que devuelve el valor numérico Unicode asociado al caracter indicado...

Aunque una manera muy sencilla de realizar esta búsqueda exacta, discriminando mayúsculas de minúsculas, podría haber sido alguno de los método descritos aquí.
O incluso aplicando celda a celda un fórmula matricial del estilo:
=UNIRCADENAS("";0;UNICODE(EXTRAE(TblBUSCAR[@codigo];SECUENCIA(LARGO(TblBUSCAR[@codigo]));1)))
Caracteres UNICODE PQ vs Fórmula

Para luego sobre el rango auxiliar realizar la búsqueda según esa combinación numérica concatenada de caracteres Unicode...

Sin embargo decidí probar a aplicar una fórmula desbordada/dynamic array y verificar su comportamiento...
Caracteres UNICODE PQ vs Fórmula

Así pues monté la siguiente fórmula, en la celda F12, compuesta de otras funciones (LET, UNIRCADENAS, XMLFILTRO, SECUENCIA, etc):
=SI.ERROR(XMLFILTRO("<inicio><fila><dato>"&SUSTITUIR(
LET(rng;LET(
codigo;TblBUSCAR[codigo];
arr;LET(n;MAX(LARGO(codigo));
SI.ERROR(UNICODE(EXTRAE(codigo;SECUENCIA(1;n);1));""));
arr);
Cols1;SECUENCIA(1;COLUMNAS(rng));
Cols2;SECUENCIA(1;COLUMNAS({1}));
NCols1;COLUMNAS(rng);
NCols2;COLUMNAS({1});
TotalFilas;SECUENCIA(FILAS(rng));
TotalCols;SECUENCIA(1;NCols1+NCols2);

dispo;MULTIPLO.SUPERIOR.MAT(SECUENCIA(6;NCols1+1);NCols1+1)/(NCols1+1);
matriz;SI(TotalCols<=NCols1;INDICE(rng;TotalFilas;TotalCols);INDICE({"|";"|";"|";"|";"|";"|"};TotalFilas;TotalCols-NCols1));
fila;SECUENCIA(6);
arr;INDICE(dispo;fila;SECUENCIA(1;TotalCols));
IZQUIERDA(UNIRCADENAS("";0;SI(arr=fila;matriz;""));LARGO(UNIRCADENAS("";0;SI(arr=fila;matriz;"")))-1));

"|";"</dato><dato>")&"</dato></fila></inicio>";"//fila/dato");"")
Fórmula preparada para trabajar sobre los seís código de la TblBUSCAR!!.
La limitación que surgió al aplicar esta 'formulita' fue que XMLFILTRO convertía a valor numérico cada uno de las secuencias Unicode de cada dato!! :O
Lo que genera un gran perjuicio cuando el valor devuelto en Unicode supera la precisión de Excel de los 15 dígitos!!.
Fíjate en la imagen anterior en las celdas en amarillo... los últimos dígitos se han perdido en las celdas:
8510551455098202 -- 8510551455098200
2507351585022466 -- 2507351585022460

Por lo que probé con otra de las herramientas de Excel: Power Query
Como siempre cargamos la tabla 'TblBUSCAR' al editor de Power Query, y desde el editor avanzado la query quedó:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblBUSCAR"]}[Content],
    //convertimos cada caracter a su valor UNICODE
    AddCol_Caracteres  = Table.AddColumn(Origen, "unicode", 
    						each List.Accumulate(
                                   Text.ToList([codigo])
                                   , ""
                                   , (state, current)=>
                                      	state
                                        &
                                        Number.ToText(Character.ToNumber(current), "0")))
in
    AddCol_Caracteres

Caracteres UNICODE PQ vs Fórmula

En este caso, empleando funciones M ya vistas en el blog
Text.ToList leer aquí
y List.Accumulate leer aquí
Conseguimos descomponer en caracteres individuales cada 'código' (con 'Text.ToList'), para que luego 'List.Accumulate' procese caracter a caracter recuperando su valor Unicode (Character.ToNumber), darle finalmente formato de texto a cada valor... concatenándolas paso a paso.

El resultado final es una cadena de texto compuesto por todos los valores Unicode de cada caracter, como necesitábamos...

Un ejercicio que demuestra que debemos saber discernir entre los caminos que nos ofrece Excel, cuál es el óptimo y eficaz ;-)

No hay comentarios:

Publicar un comentario

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