Text.Clean(text as nullable text) as nullable text
¿Qué hace?
Elimina todos los caracteres no imprimibles de un texto (caracteres de control, tabuladores, saltos de línea, etc.). Muy útil al importar datos de sistemas legacy.
Ejemplo
Text.Clean("hola" & Character.FromNumber(9) & "mundo")
// Elimina el tabulador: "holamundo"
// En una columna
Table.TransformColumns(tabla, {{"Descripcion", Text.Clean}})
⚠️ Ojo con esto:Text.Clean elimina saltos de línea (#(lf), #(cr)). Si necesitas conservarlos, usa Text.Replace primero.
🔍
Búsqueda
Text.Contains
Principiante
Sintaxis
Text.Contains(text as nullable text, substring as text, optional comparer as nullable function) as nullable logical
¿Qué hace?
Devuelve true si el texto contiene la subcadena especificada. Por defecto es sensible a mayúsculas.
Text.Contains("Kawaii Power BI", "Power")
// true
// Búsqueda sin distinción de mayúsculas
Text.Contains("Madrid Centro", "madrid", Comparer.OrdinalIgnoreCase)
// true
// Filtrar filas que contengan "ERROR"
Table.SelectRows(tabla, each Text.Contains([Mensaje], "ERROR"))
Text.StartsWith / Text.EndsWith
Principiante
Sintaxis
Text.StartsWith(text as nullable text, substring as text, optional comparer as nullable function) as nullable logical
Text.EndsWith(text as nullable text, substring as text, optional comparer as nullable function) as nullable logical
¿Qué hace?
Comprueba si un texto empieza o termina con una subcadena determinada. Muy útiles para filtrar por prefijos o sufijos.
Text.PositionOf(text as text, substring as text, optional occurrence as nullable number, optional comparer as nullable function) as any
¿Qué hace?
Devuelve la posición (índice base 0) donde aparece la subcadena. Si no se encuentra, devuelve -1. Con Occurrence.All devuelve una lista de todas las posiciones.
💡 Tip kawaii: Las ranges de caracteres {"0".."9"} y {"A".."Z"} son una sintaxis muy potente de M para definir conjuntos de caracteres de forma concisa.
✂️
Dividir y Combinar
Text.Split
Principiante
Sintaxis
Text.Split(text as text, separator as text) as list
¿Qué hace?
Divide un texto por el separador indicado y devuelve una lista de fragmentos. El equivalente M de TEXTOANTESDE/TEXTODESPUESDE de Excel pero más potente.
Ejemplo
Text.Split("Madrid;Barcelona;Valencia", ";")
// {"Madrid", "Barcelona", "Valencia"}
// Obtener el primer elemento tras dividir
List.First(Text.Split([Email], "@"))
// Devuelve el nombre de usuario del email
Text.Combine
Principiante
Sintaxis
Text.Combine(texts as list, optional separator as nullable text) as text
¿Qué hace?
Une una lista de textos, opcionalmente con un separador. Es el inverso de Text.Split.
Text.Start(text as nullable text, count as number) as nullable text
Text.End(text as nullable text, count as number) as nullable text
¿Qué hace?
Extrae los primeros (o últimos) count caracteres de un texto. Equivalentes a IZQUIERDA/DERECHA de Excel.
Ejemplo
Text.Start("ES-2024-001", 2) // "ES"
Text.End("informe_2024.xlsx", 4) // "xlsx"
// Extraer código de país de un identificador
Text.Start([CodigoProducto], 3) // "ESP", "FRA", etc.
Text.Middle
Intermedio
Sintaxis
Text.Middle(text as nullable text, start as number, optional count as nullable number) as nullable text
¿Qué hace?
Extrae una subcadena desde la posición start (base 0) con longitud count. Si omites count, extrae hasta el final. Equivalente a EXTRAE de Excel.
Ejemplo
Text.Middle("ES-2024-001", 3, 4) // "2024"
Text.Middle("ES-2024-001", 3) // "2024-001"
// Extraer año de un código con formato "XX-YYYY-NNN"
Text.Middle([Codigo], 3, 4)
Text.BeforeDelimiter / Text.AfterDelimiter
Intermedio
Sintaxis
Text.BeforeDelimiter(text as nullable text, delimiter as text, optional index as any) as any
Text.AfterDelimiter(text as nullable text, delimiter as text, optional index as any) as any
¿Qué hace?
Extrae el texto antes o después de un delimitador. El parámetro index permite especificar la ocurrencia (0 = primera, {0, RelativePosition.FromEnd} = última).
📌 Buena práctica: Prefiere Text.BeforeDelimiter / Text.AfterDelimiter sobre combinaciones de Text.PositionOf + Text.Middle. El código queda más legible y mantenible.
Text.BetweenDelimiters
Intermedio
Sintaxis
Text.BetweenDelimiters(text as nullable text, startDelimiter as text, endDelimiter as text, optional startIndex as any, optional endIndex as any) as any
¿Qué hace?
Extrae el texto comprendido entre dos delimitadores. Ideal para parsear cadenas con estructura definida.
Text.PadStart(text as nullable text, count as number, optional character as nullable text) as nullable text
Text.PadEnd(text as nullable text, count as number, optional character as nullable text) as nullable text
¿Qué hace?
Rellena un texto al inicio (PadStart) o al final (PadEnd) hasta alcanzar la longitud count. Por defecto rellena con espacios, pero puedes especificar otro carácter.
Text.Format(formatString as text, arguments as any, optional culture as nullable text) as text
¿Qué hace?
Construye un texto interpolando valores en una plantilla de formato. Los marcadores de posición son #{0}, #{1}, etc. (o claves si pasas un record).
Ejemplo
// Con lista de argumentos
Text.Format("Hola #{0}, tienes #{1} mensajes", {"María", 5})
// "Hola María, tienes 5 mensajes"
// Con record (más legible)
Text.Format("#{ciudad} registró #{ventas} ventas en #{año}",
[ciudad = "Madrid", ventas = 1500, año = 2024])
// "Madrid registró 1500 ventas en 2024"
📌 Buena práctica: Usa Text.Format con records cuando tienes más de 2-3 valores a interpolar. Los nombres de clave hacen el código mucho más legible que índices numéricos.
🚀 ¡Dominas el texto! Ahora explora las Funciones de Número para operaciones matemáticas y de redondeo avanzadas.