Necesita analizar los primeros 19 caracteres en la línea en la que se encuentra una cadena específica

Un usuario Pregunto ✅

bR851236574

Necesito los primeros 19 caracteres de la línea en la que se encuentra la primera cadena de «(Comentarios adicionales)».

La celda contiene texto con entradas potencialmente múltiples de notas de trabajo y/o comentarios adicionales con su marca de fecha/hora asociada. Solo quiero la fecha/hora más reciente para comentarios adicionales.

Aquí hay un ejemplo de una de las celdas de mis datos de origen. La forma en que se almacenan los datos, la entrada más reciente siempre es la primera. Como puede ver, las notas de trabajo son las más recientes. Necesito que regrese «19/06/2020 13:26:02».

Ejemplo de datos:

24/06/2020 15:01:21 – Jane Smith (notas de trabajo)

Agregando: Build ECheck-in WQ para ASC

19/06/2020 13:26:02 – Josh Miller (Comentarios adicionales)

Tina Jones se agregará al Informe de la recepción

Intentos:

si Texto.Contiene([Comments and Work notes],»(Comentarios adicionales)») y luego Text.BeforeDelimiter([Comments and Work notes],» -«) demás «»

Esto funciona si un comentario adicional es más reciente pero devuelve 24/06/2020 15:01:21 cuando necesito 19/06/2020 13:26:02.

si Texto.Contiene([Comments and Work notes],»(Comentarios adicionales)») y luego Text.BeforeDelimiter([Comments and Work notes],» (Comentarios adicionales)») else «»

Nuevamente, esto funciona si los comentarios adicionales son los más recientes; de lo contrario, devuelve:

24/06/2020 15:01:21 – Jane Smith (notas de trabajo)

Agregando: Build ECheck-in WQ para ASC

19/06/2020 13:26:02 – Josh Miller

Desafortunadamente, no puedo capturar una cantidad x de caracteres a la izquierda de «(Comentarios adicionales)» como delimitador porque el nombre justo antes varía en longitud y no está entre 2 delimitadores.

¿Alguna idea o sugerencia?

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

No había leído todo y no había visto el caso de muchas líneas con «(Añadir…»).

la expresión modificada para manejar esta situación según sea necesario:

Lista.Max(Lista.Transformar(
List.Select(pruebe Text.Split([comments],»#(lf)») de lo contrario {},
cada Text.Contains(_,»(Add»)), cada DateTime.FromText(Text.Start(_,19),»en-US»))))

Tuve que usar el parámetro opcional «en-US» porque las fechas están en un formato diferente al de mi país.
Probablemente no lo necesites.

lbendlin

no está claro en su descripción si los datos están todos en una columna o distribuidos en columnas. Proporcione una muestra en formato de tabla

Rocco_sprmnt21

En respuesta a lbendlin

comencemos con este intento, asumiendo que la estructura de la cadena es siempre la proporcionada:

= Table.AddColumn(#"Modificato tipo", "Personalizzato", each Text.BetweenDelimiters([comments],"#(lf)","-",{1, RelativePosition.FromEnd}))

Para probar una solución más general, eventualmente debería proporcionar más ejemplos con una estructura diferente.

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

un enfoque más general para tratar de obtener los primeros 19 caracteres de la primera (¿y única?) línea que contiene una cadena dada:

Table.AddColumn(#"Modificato tipo", "Personalizzato", each Text.Start(List.Select(Text.Split([comments],"#(lf)"), each Text.Contains(_,"(Add")){0},19))

bR851236574

En respuesta a Rocco_sprmnt21

Aquí hay algunos ejemplos más de cómo se captura el texto. Cada cambio de color es una celda diferente en la tabla. Hice la fecha/hora que necesito en negrita. Como puede ver, el orden es variable.

bR851236574_0-1593290971782.png

bR851236574

En respuesta a lbendlin

Con suerte @lbendlin esto es lo que estás pidiendo.

bR851236574_0-1593289262542.png

lbendlin

En respuesta a bR851236574

Gracias. Es una pregunta difícil porque debe incluir los saltos de línea (n) en la búsqueda.

En Power Query habla que es «#(lf)»

Aquí hay un ejemplo.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjKNyTM2UYqNBQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Text.PositionOf([Column1],"#(lf)"))
in
    #"Added Custom"

bR851236574

En respuesta a lbendlin

@lbendlin Modifiqué la consulta. En la nueva columna personalizada que creé, creó una Tabla en la celda cada vez que encontró «(Comentarios adicionales)». El problema es que los únicos datos creados en la nueva tabla son 25 34, 2. ¿Necesito personalizar la consulta, si es así, qué campos?

El campo y la cadena que estoy buscando es ([Comments and Work notes],»(Comentarios adicionales)»). El nombre de mi tabla es «Datos de ServiceNow»

imagen.pngimagen.png

si Texto.Contiene([Comments and Work notes],»(Comentarios adicionales)») luego
dejar
Fuente = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText(«i45WMjKNyTM2UYqNBQA=», BinaryEncoding.Base64), Compression.Deflate)), let _t = ((escriba texto anulable) meta [Serialized.Text = true]) en la tabla de tipos [Column1 = _t]),
#»Tipo cambiado» = Table.TransformColumnTypes(Source,{{«Column1», type text}}),
#»Personalizado añadido» = Table.AddColumn(#»Tipo cambiado», «Personalizado», cada Text.PositionOf([Column1],»#(si)»))
en
#»Añadido personalizado» más «»

lbendlin

En respuesta a bR851236574

Sí, mi ejemplo simplemente demuestra cómo ubicar los saltos de línea en sus datos. Lo que deberá cambiar en su consulta es

– encontrar la ubicación de «(Comentarios adicionales)»

– encuentra la ubicación del último «#(lf)» antes de esa ubicación Si no se encuentra, significa que está en la primera línea.

– agarrar los siguientes 19 caracteres después esa ubicación «#(lf)» (o los primeros 19 caracteres de sus datos si no se encuentran)

lbendlin

En respuesta a lbendlin

Aquí hay otro ejemplo que implementa la lógica.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("lY8/C8IwEEe/ytGpBaWX6x/sbToWOjk41A7BBhraJNAE+vWNKIrg4v7evd/1fYJ1TmVOSAiiYhRMAvbQSqvgbHSYIN3cOoN1QfnsaiMumhdeMNWM9MCdn6DTy6JWSI/jqIN2Vi5wc8YoG3yWDLuYqnI8RFc0IEoukKmIbifj+VYa5X+rsfnlUcXl2zu5TVlIL5+Jz9I/TyXDcAc=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Comments and work notes" = _t]),
    #"Added Custom" = Table.AddColumn(Source, "HasComments", each Text.PositionOf([Comments and work notes],"(Additional comments)")),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "After LF", each try Text.PositionOf(Text.Middle([Comments and work notes],0,[HasComments]),"#(lf)",Occurrence.Last) otherwise -1),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Result", each if [After LF]>-1 then Text.Middle([Comments and work notes],[After LF]+1,19) else if [HasComments]>-1 then Text.Middle([Comments and work notes],0,19) else "no comments")
in
    #"Added Custom2"

Compruébalo en el editor de consultas.

bR851236574

En respuesta a lbendlin

Gracias por el ejemplo adicional. Cuando lo puse en mi consulta existente, creó una subtabla que pude expandir. Creó 3 filas para cada registro de fila existente en mi tabla existente (ServieNow Data) y colocó los mismos 3 resultados para cada uno para que no parezca que en realidad está mirando al campo. [Comments and Work notes] para cada fila, pero codifiqué las respuestas de los datos de muestra que proporcioné anteriormente.

Me pregunto si esta parte del código está codificando algo en lugar de mirar al campo. No estoy seguro de a qué se decodifican las letras/números aleatorios.

Fuente = Table.FromRows (Json.Document (Binary.Decompress (Binary.FromText ( «Ly8 / C8IwEEe / ytGpBaWX6x / sbToWOjk41A7BBhraJNAE + vWNKIrg4v7evd / 1fYJ1TmVOSAiiYhRMAvbQSqvgbHSYIN3cOoN1QfnsaiMumhdeMNWM9MCdn6DTy6JWSI / jqIN2Vi5wc8YoG3yWDLuYqnI8RFc0IEoukKmIbifj + VYa5X + rsfnlUcXl2zu5TVlIL5 + Jz9I / TyXDcAc =»

bR851236574_0-1593378303914.png

Rocco_sprmnt21

En respuesta a lbendlin

@bR851236574

¿Has probado esta expresión?

Table.AddColumn(#"Modificato tipo", "Personalizzato", each Text.Start(List.Select(Text.Split([comments],"#(lf)"), each Text.Contains(_,"(Add")){0},19))

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

Si puede tener más líneas con la cadena «(Add ….»,

intente agregar una columna personalizada con código ti:

 List.Transform(List.Select(
        Text.Split([comments],"#(lf)"), 
              each Text.Contains(_,"(Add")),
                          each Text.Start(_,19) 
                                                 ))

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

@bR851236574

Pruebe esto (con mi ejemplo de juguete parece hacer lo que espera. Debe verificar cuidadosamente el nombre de las tablas y columnas involucradas y eventualmente cambiar), donde agregué mis líneas de código después de la parte de su secuencia de comandos que se carga en los datos:

Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjKNyTM2UYqNBQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Dates_Comment", each
                                                List.Transform(List.Select(
                                                        Text.Split([Comments and Work notes],"#(lf)"), 
                                                                        each Text.Contains(_,"(Add")),
                                                                                   each Text.Start(_,19) 
                                                                                                         )),
    texp = Table.ExpandListColumn(extractString, "Dates_Comment")
in
    texp

bR851236574

En respuesta a Rocco_sprmnt21

Gracias @Rocco_sprmnt21. Intenté su consulta de columna personalizada a continuación y obtengo un error EOF antes de que pueda archivar, pero no veo paréntesis perdidos. ¿También necesito editar el nombre de la tabla específica o el nombre del campo en algún lugar de su ejemplo? Gracias de nuevo.

Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText(«i45WMjKNyTM2UYqNBQA=», BinaryEncoding.Base64), Compression.Deflate)), let _t = ((escriba texto anulable) meta [Serialized.Text = true]) en la tabla de tipos [Column1 = _t]),
#»Tipo cambiado» = Table.TransformColumnTypes(Source,{{«Column1», type text}}),
#»Personalizado añadido» = Table.AddColumn(#»Tipo cambiado», «Dates_Comment», each
Lista.Transformar(Lista.Seleccionar(Texto.Dividir([Comments and Work notes],»#(lf)»),cada Texto.Contiene(_,»(Agregar»)),cada Texto.Inicio(_,19)texp = Table.ExpandListColumn(extractString, «Dates_Comment») en texp

Rocco_1.PNG

Rocco_sprmnt21

En respuesta a bR851236574

Hola @bR851236574 algunos caracteres parecen haber volado 😀.

Intenta cambiar para que tengas:

Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText(«i45WMjKNyTM2UYqNBQA=», BinaryEncoding.Base64), Compression.Deflate)), let _t = ((escriba texto anulable) meta [Serialized.Text = true]) en la tabla de tipos [Column1 = _t]),
#»Tipo cambiado» = Table.TransformColumnTypes(Source,{{«Column1», type text}}),
#»Personalizado añadido» = Table.AddColumn(#»Tipo cambiado», «Dates_Comment», each
Lista.Transformar(Lista.Seleccionar(Texto.Dividir([Comments and Work notes],»#(lf)»),cada Texto.Contiene(_,»(Agregar»)),cada Texto.Inicio(_,19) )),

texp = Table.ExpandListColumn(extractString, «Dates_Comment»)

en texto

bR851236574

En respuesta a Rocco_sprmnt21

@ Rocco_sprmnt21 Sigo recibiendo el error EOF con su cambio. ¿También necesito cambiar alguno de estos campos para que coincida con el nombre de mi tabla o los nombres de campo?

También intenté agregar let Source = al principio para ver si eso ayudaría. Eliminó el error EOF pero luego recibió un error de expresión «No se reconoció el nombre» extractString «.

Rocco_2.PNG

Rocco_sprmnt21

En respuesta a bR851236574

copie y pegue el siguiente código en la herramienta Agregar columna personalizada de esta manera:

Lista.Transformar(Lista.Seleccionar(Texto.Dividir([Comments and Work Notes],»#(lf)»), cada Texto.Contiene(_,»(Agregar»)), cada Texto.Inicio(_,19)))

imagen.png

obtienes una tabla como esta (no sé todos los nombres de tus columnas)

imagen.png

después de haber expandido la columna llamado «Fecha de comentarios», debería obtener algo como esto:

imagen.png

bR851236574

En respuesta a Rocco_sprmnt21

@Rocco_sprmnt21

Ok, comencé desde cero para eliminar tantas variables como fuera posible. Los datos de origen que he importado solo contienen 1 columna de datos.

Nombre de la tabla existente: #»Datos de ServiceNow»

Columna existente en la tabla que contiene los comentarios y notas de trabajo: [Comments and work notes]

bR851236574_4-1593457123194.png

Intenté crear una columna personalizada [Comments Date] una vez con cada expresión enumerada a continuación. Ambos devolvieron Error en la nueva columna. ¿Hay algún paso aplicado que me falta al transformar los datos?

Table.AddColumn(#»Datos de ServiceNow», «Fecha de comentarios», cada List.Transform(List.Select(Text.Split([Comments and Work Notes],»#(lf)»), cada Texto.Contiene(_,»(Agregar»)), cada Texto.Inicio(_,19)))

bR851236574_2-1593456717496.png

Lista.Transformar(Lista.Seleccionar(Texto.Dividir([Comments and Work Notes],»#(lf)»), cada Texto.Contiene(_,»(Agregar»)), cada Texto.Inicio(_,19))

bR851236574_3-1593456743976.png

Rocco_sprmnt21

En respuesta a bR851236574

Hola,

dentro de la adición de columna personalizada, debe usar SOLO la segunda forma de expresión, es decir

:

[Comments and Work Notes]Lista.Transformar(Lista.Seleccionar(Texto.Dividir(

,»#(lf)»), cada Texto.Contiene(_,»(Agregar»)), cada Texto.Inicio(_,19))

preste atención a los nombres de las columnas.Las formas minúsculas y mayúsculas también son relevantes

.

Me parece que usó la etiqueta «Comentarios y notas de trabajo» para nombrar una columna, en cambio, en el formulario se usa «Comentarios y notas de trabajo» (la primera letra de Notas está en mayúscula). Cambia uno de los dos para que tengan el mismo nombre.

PD Si obtiene algún error, intente hacer clic en la celda (eventualmente profundizar) para obtener la descripción completa. Somjetime 😁

es útil para depurar el código.

la segunda expresión es lo que ve dentro del editor avanzado y es lo que PBI construye para usted cuando ingresa el primer formulario (más corto) en la herramienta de agregar columna personalizada

bR851236574

En respuesta a [Comments and Work notes] Rocco_sprmnt21

@ Rocco_sprmnt21 Tenía N mayúscula y era minúscula. Consejos súper útiles. ¡Eso pareció funcionar en mis pequeños datos de prueba! Lo ejecuté en un conjunto de datos más grande y se produce un error cuando el

el campo es nulo.

Expression.Error: no podemos convertir el valor nulo al tipo Texto.
Detalles:[Type]

Valor=

Tipo=

¿Cómo modifico la consulta para tener en cuenta los valores nulos?

Por ejemplo, si la celda contiene lo siguiente, crea 7 filas, una para cada comentario adicional.  Solo necesito 19/06/2020 16:48:52

bR851236574_0-1593465549433.png

bR851236574_1-1593465816482.png

bR851236574_1-1593465816482.png

26/06/2020 09:54:59 – Ellie James (notas de trabajo)
Actualización semanal: el proveedor puede programar una reunión la próxima semana.

19/06/2020 16:48:52 – Ellie James (Comentarios adicionales)
Hizo planes para reunirse con el equipo.

12/06/2020 16:35:34 – Ellie James (Comentarios adicionales)
Actualización semanal: en espera de una respuesta del proveedor sobre el último problema.

05/06/2020 15:15:08 – Ellie James (Comentarios adicionales)
Actualización semanal: en espera de una respuesta del proveedor sobre el último problema.

29/05/2020 18:28:08 – Ellie James (Comentarios adicionales)
Actualización semanal: en espera de una respuesta del proveedor sobre el último problema.

22/05/2020 18:09:50 – Ellie James (Comentarios adicionales)
Actualización semanal: en espera de una respuesta del proveedor sobre el último problema.

15/05/2020 17:41:27 – Ellie James (Comentarios adicionales)
Actualización semanal: en espera de una respuesta del proveedor sobre el último problema.

08/05/2020 08:55:27 – Ellie James (Comentarios adicionales)

Actualización semanal: en espera de una respuesta del proveedor sobre el último problema…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *