martes, 20 de noviembre de 2018

Power Query: Funciones M de texto

Al hilo del post publicado aquí, donde con algunas matriciales y funciones de texto en la hoja de cálculo recuperábamos información por la derecha y/o izquierda de una cadena de texto, un lector (Daniel Herce) a través de un comentario compartía la misma operación empleado una consulta de Power Query.

Me pareció interesante la perspectiva y poder explicar de paso algunas de las funciones M de texto en Power Query.


Decir nuevamente que en Power Query existen bastantes más funciones de texto de las que se nos ofrece en la hoja de cálculo.. por lo que las posibilidades para recuperar, tratar o modificar nuestros textos son casi infinitas.
A modo de ejemplo comentaré algunas de las funciones M de texto más frecuentes:
Text.Upper(texto) - equivale a la función MAYUSC
Text.Lower(texto) - equivale a la función MINUSC
Text.Proper(texto) - equivale a la función NOMPROPIO
Text.Start(texto, Num caracteres) - equivale a la función IZQUIERDA
Text.End(texto, Num caracteres) - equivale a la función DERECHA
Text.Length(Texto) - equivale a la función LARGO
Text.Middle(texto, inicio, Num caracteres) - equivale a la función EXTRAE
Text.Contains(texto principal, texto buscado) - equivale a la función ENCONTRAR, HALLAR, pero devuelve VERDADERO/FALSO !!
Text.Replace (texto, texto_viejo, texto_nuevo) - - equivale a la función SUSTITUIR

y otras sin equivalencia:
Text.Reverse(text) - devuelve la cadena de texto al revés...
Text.PositionOfAny(string as text, list as list, optional occurrence as nullable number)
las opciones de ocurrencia:
Occurrence.First - devuelve un único valor
Occurrence.Last - devuelve un único valor
Occurrence.All - devuelve una matriz de coincidencias
Text.Split(texto, separador) - devuelve particionada la cadena de texto de acuerdo al delimitador indicado
Text.Remove(texto, caracter a eliminar) - elimina de la cadena de texto el caracter indicado
Text.Range(texto, inicio, opcional Num caract) - similar a EXTRAE
Devuelve la subcadena de la texto encontrado en la posición de inicio dada. Se puede incluir un parámetro opcional, 'Num caract', para especificar cuántos caracteres devolver...

y muchas más...


Sobre nuestro listado de matrículas expuesto en el post indicado generaremos la siguiente consulta personalizada.

Power Query: Funciones M de texto


Cargamos nuestra Tabla llamada 'TblMatriculas' que tiene un solo campo '[Matrículas]'.
Así como siempre desde la ficha Datos > grupo Obtener y transformar > Desde una tabla creamos nuestra consulta, y accederemos al Editor avanzado donde añadiremos el siguiente código:
let

Source = Excel.CurrentWorkbook(){[Name="TblMatriculas"]}[Content],
/* definimos la matriz de valores numéricos*/
Numeros = {"0","1","2","3","4","5","6","7","8","9"},

/*identificamos las posiciones de los primeros y últimos números...*/
PosIni= each Text.PositionOfAny([Matrículas],Numeros,Occurrence.First),
PosUlt= each Text.PositionOfAny([Matrículas],Numeros,Occurrence.Last) + 1,
/*y la longitud o número de caracteres total*/
NumCaract= each Text.Length([Matrículas]),

/*recuperamos las cadenas por la izquierda*/
primero=each Text.Start([Matrículas], Text.PositionOfAny([Matrículas],Numeros,Occurrence.First)),
/*y desde en medio hasta el final*/
ultimo= each Text.Range([Matrículas], Text.PositionOfAny([Matrículas],Numeros,Occurrence.Last) + 1),
/*Una alternativa al anterior para recuperar datos por la derecha*/
por_dcha=each Text.End([Matrículas],
Text.Length([Matrículas])-Text.PositionOfAny([Matrículas],Numeros,Occurrence.Last)-1),

/*las cadenas recuperadas las llevamos a nuevas columnas*/
Izqda = Table.AddColumn(Source,"Texto_izda", primero),
Dcha = Table.AddColumn(Izqda,"Texto_dcha", ultimo),
Final= Table.AddColumn(Dcha,"por dcha", por_dcha),

Interior = Table.AddColumn(Final,"Texto_interior", each Text.Range([Matrículas],
Text.PositionOfAny([Matrículas],Numeros,Occurrence.First),
Text.PositionOfAny([Matrículas],Numeros,Occurrence.Last) -
Text.PositionOfAny([Matrículas],Numeros,Occurrence.First) + 1 )),

/*A modo estadístico trasladamos las posiciones relevantes a columnas nuevas */
largo = Table.AddColumn(Interior,"num caract total", NumCaract),
primer= Table.AddColumn(largo,"primer num", PosIni),
ult= Table.AddColumn(primer,"ult num", PosUlt)

in
ult


Power Query: Funciones M de texto



Hay una breve explicación en cada línea, añadida con comentarios...
Aunque se puede observar que las funciones empleadas, y ya comentada, son:
Text.Start
Text.End
Text.Range
y Text.PositionOfAny


y las acciones necesarias para ir añadiendo columnas (Table.AddColumn) a la consulta e incorporar los datos tratados.


El resultado se puede visualizar en la primera imagen del post... como era de esperar el resultado es correcto... y como decía nuestro lector, algo más intuitivo que las funciones matriciales.

No hay comentarios:

Publicar un comentario

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