Una situación tediosa, en la que me he visto frecuentemente envuelto, es la de recuperar fechas contenidas en una cadena de texto
En el supuesto de hoy expondré la solución, que después de varios intentos, he desarrollado como más óptima...
Seguro que los expertos en la materia encontrarán una alternativa más eficiente y corta...
Si bien, mi ejemplo me parece interesante por el uso de alguna función poco habitual como por ejemplo:
Text.ToList
que tiene la peculiaridad de 'desmenuzar' un texto en cada uno de sus caracteres.
Esto nos permite descubrir si en una cadena de texto existe algún caracter empleando, por ejemplo. otra función curiosa:
List.ContainsAny
que localiza elementos de la segunda lista en la primera...
Mencionadas estas dos funciones, podemos desarrollar nuestro código M.
A partir de la carga de la tabla original con nuestros texto, continuaremos la consulta con el siguiente código:
El resultado, a priori, parece el deseado ;-)
En el supuesto de hoy expondré la solución, que después de varios intentos, he desarrollado como más óptima...
Seguro que los expertos en la materia encontrarán una alternativa más eficiente y corta...
Si bien, mi ejemplo me parece interesante por el uso de alguna función poco habitual como por ejemplo:
Text.ToList
que tiene la peculiaridad de 'desmenuzar' un texto en cada uno de sus caracteres.
Esto nos permite descubrir si en una cadena de texto existe algún caracter empleando, por ejemplo. otra función curiosa:
List.ContainsAny
que localiza elementos de la segunda lista en la primera...
Mencionadas estas dos funciones, podemos desarrollar nuestro código M.
A partir de la carga de la tabla original con nuestros texto, continuaremos la consulta con el siguiente código:
let //cargamos los datos.. Origen = Excel.CurrentWorkbook(){[Name="TblFechas"]}[Content], //añadimos una columna con el cálculo deseado ToC=Table.AddColumn(Origen, "Extrae_Fecha", each let //Limpiamos de caracteres no deseados nuestras cadenas de texto //Usamos Text.Select para detrerminar qué caracteres permanecen txt=Text.Select(Text.From([col1]),{"0".."9","/","-",".","|"," "}), //separamos el texto resultante por un separador que se repite en el ejemplo //dependerá de la cadena de texto... partes=Text.Split(txt,"|"), //realizamos una selección de las partes obtenidas //pero solo cuando concurran dos condiciones: //1-que el texto resultante tenga más de 8 caracteres // (suponemos que cuanlquier fecha, al menos, tiene // un patrón dd/mm/aa // o bien dd/mm/aaaa - con 10 caracteres) //2-otra condición es que la parte de texto a analizar tendrá dos veces el separador de fecha // (alguno de los habituales: . / - selecc=Text.Trim( List.Select(partes, each List.Count(Text.ToList(_))>=8 and List.Count(List.PositionOfAny(Text.ToList(_),{".","/","-"},Occurrence.All))=2){0}), //Una última criba donde permanece la primera 'subparte' tb=Text.BeforeDelimiter(selecc," "), calc=if tb="" then selecc else tb in //finalmente aplicamos la conversión de la fecha // aplicando la 'cultura' de fecha en español try Date.FromText(calc,[Culture="es-ES"]) otherwise null)[[Extrae_Fecha]] in ToC
El resultado, a priori, parece el deseado ;-)
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.