Expandir columna donde no todos los registros son tablas

Un usuario Pregunto ✅

nhoff

Desde un archivo XML original, estoy tratando de expandir esta columna:

Udklip1.JPG

Cuando hago esto, obtengo el siguiente resultado:

Udklip2.JPG

Algunos registros no están en el nivel de ‘texto’, algunos siguen siendo tablas. Si marco uno de los registros con valor de tabla, puedo ver el siguiente contenido:

Udklip3.JPG

Si ahora trato de expandir la columna, aparece el siguiente error:

Udklip4.JPG

¿Cómo expando la columna?

ImkeF

Esto parece ser un poco complicado. Agregas una columna que verifica si el contenido de la fila actual de la columna a expandir es de tipo tabla. En ese caso, toma el valor tal como está y, si no, transforma el valor de texto en una tabla. De esa forma, todos los campos estarán en formato de tabla y se podrán expandir:

let

    Source = {1, #table({"a", "A"}, {{"b", "B"}})},
    #"In Tabelle konvertiert" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    Step2 = Table.AddColumn(#"In Tabelle konvertiert", "Custom", each if Value.Is([Column1], type table) then [Column1] else #table({"ConvertedText"}, {{[Column1]}})),
    #"Erweiterte Custom" = Table.ExpandTableColumn(Step2, "Custom", Table.ColumnNames(Table.Combine(Step2[Custom])), Table.ColumnNames(Table.Combine(Step2[Custom])))
in
    #"Erweiterte Custom"

ImkeF

Hola @Mr_Tank,
parece que tienes una tabla anidada. En ese caso, simplemente repita el proceso.

Sr_Tanque

Hola @ImkeF, veo que eres muy útil con este problema. Mi problema es que ninguno de los códigos anteriores resolvió mi problema. Tengo «nulo» y «Tabla» en mi columna «Imágenes adicionales» antes y después de la expansión. Vea las capturas de pantalla a continuación. Las tablas (con los registros «Elemento:Texto» adentro) deben expandirse a nuevas columnas. ¿Puedes ayudarme?

Imágenes adicionales para expandir.png

Imágenes adicionales después de expandirse.png

scastrontu

Hola,

He leído todas las publicaciones, pero como no manejo el lenguaje M… No puedo pensar en cómo integrar las soluciones dadas. Además, en mi caso es al revés. Vea la imagen a continuación. Mi error está en la fila 361. No puede convertir el valor de la columna «element.text» en una tabla, por lo que no puedo cargar la consulta. Sin embargo, como puede ver, tengo varias columnas con «tabla» o «texto». En mi caso, quiero el texto dentro de cada tabla (ver imagen), en lugar de convertir el texto a «Tablas». También he adjuntado el editor.

Gracias.

Editor avanzado.png

consulta.png

ImkeF

En respuesta a scastrontu

Hola @scastrontu,

compruebe si las instrucciones de este video ayudan a integrar el código M en su solución. https://community.powerbi.com/t5/Webinars-and-Video-Gallery/Power-BI-Forum-Help-How-to-integrate-Mc…

ImkeF

Esto parece ser un poco complicado. Agregas una columna que verifica si el contenido de la fila actual de la columna a expandir es de tipo tabla. En ese caso, toma el valor tal como está y, si no, transforma el valor de texto en una tabla. De esa forma, todos los campos estarán en formato de tabla y se podrán expandir:

let

    Source = {1, #table({"a", "A"}, {{"b", "B"}})},
    #"In Tabelle konvertiert" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    Step2 = Table.AddColumn(#"In Tabelle konvertiert", "Custom", each if Value.Is([Column1], type table) then [Column1] else #table({"ConvertedText"}, {{[Column1]}})),
    #"Erweiterte Custom" = Table.ExpandTableColumn(Step2, "Custom", Table.ColumnNames(Table.Combine(Step2[Custom])), Table.ColumnNames(Table.Combine(Step2[Custom])))
in
    #"Erweiterte Custom"

PedroT

En respuesta a ImkeF

Hola Imke,

Seguí su consejo y, como resultado, logré transformar los datos de una columna que tenía tipos de tabla y enteros en el conjunto de datos original en dos columnas nuevas: Clasificación.I… > Personalizado.Texto convertido y Personalizado.Elemento:Texto

Los datos originales y las columnas resultantes se ven así

Captura.PNG

Como resultado final, me gustaría tener solo una columna. Solo quería saber si fusionar estas dos columnas (Custom.ConvertedText & Custom.Element:Text) sería mi mejor opción o hay otra (mejor) manera de lograr lo mismo?

FYI: esta es la continuación de este hilo.

ImkeF

En respuesta a PedroT

Hola Pete,

eso se ve bien, y no puedo pensar en una mejor manera que fusionar ambas columnas.

PedroT

En respuesta a ImkeF

Gracias Imke, realmente me has alegrado el día al ayudarme a resolver estos problemas muy rápido. carita feliz

masplin

En respuesta a PedroT

hola imke

Intentando seguir tu código, pero no funciona para mí. En la fila AddCustom1 de mi código, estoy llamando a una función que busca datos dentro de una página web, pero no todas las filas tienen un resultado, por lo que algunas muestran un error en lugar de Table.

No estoy del todo seguro de cómo integrar su código sugerido para verificar si el resultado de Custom1 agregado es una tabla o no y luego expandir la tabla en Custom1 expandido.

Acabo de recibir un error de expresión, no podemos convertir un valor de tabla de tipo a una lista de tipo para la línea In Tabelle konvertiert. Entonces, presumiblemente, no tengo una lista en el paso anterior para usar Table.FromList.

let

    Source = Excel.Workbook(File.Contents("U:DropboxLimerstonCrawfordCRO Companies.xlsx"), null, true),
    CRO_Company_Table = Source{[Item="CRO_Company",Kind="Table"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(CRO_Company_Table,{{"Company", type text}, {"Address", type text}, {"Search", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Web_Main([Search])),
    #"Sorted Rows1" = Table.Sort(#"Added Custom",{{"Company", Order.Ascending}}),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Sorted Rows1", "Custom", {"#(lf)Website#(lf)", "#(lf)Headquarters#(lf)", "#(lf)Laboratories#(lf)", "#(lf)Company Type#(lf)", "#(lf)Certifications#(lf)", "#(lf)Year Established#(lf)", "#(lf)No. of Employees#(lf)"}, {"#(lf)Website#(lf)", "#(lf)Headquarters#(lf)", "#(lf)Laboratories#(lf)", "#(lf)Company Type#(lf)", "#(lf)Certifications#(lf)", "#(lf)Year Established#(lf)", "#(lf)No. of Employees#(lf)"}),
    #"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Custom", each Web_Description([Search])),
    #"In Tabelle konvertiert" = Table.FromList(  #"Added Custom1", Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    Step2 = Table.AddColumn(#"In Tabelle konvertiert", "Custom", each if Value.Is([Column1], type table) then [Column1] else #table({"ConvertedText"}, {{[Column1]}})),
    #"Erweiterte Custom" = Table.ExpandTableColumn(Step2, "Custom", Table.ColumnNames(Table.Combine(Step2[Custom])), Table.ColumnNames(Table.Combine(Step2[Custom]))),    
     #"Expanded Custom1" = Table.ExpandTableColumn( #"Erweiterte Custom", "Custom", {"Description"}, {"Description"}),

El error que estoy tratando de manejar se ve así en el paso anterior (no puedo insertar una imagen por alguna razón)

Tabla

Error

Tabla

Tabla

Error

ImkeF

En respuesta a masplin

Hola @masplin,

puede usar el controlador de errores «intentar …. de lo contrario» así:

#"In Tabelle konvertiert" = try Table.FromList(  #"Added Custom1", Splitter.SplitByNothing(), null, null, ExtraValues.Error) otherwise #"Added Custom1",

Intenta convertir la lista en una tabla y, si la lista no es una lista (sino una tabla), usa solo esta tabla 😉

masplin

En respuesta a ImkeF

hola imke

Parece que no hay diferencia ya que todavía tengo la celda de error en esta fila de código

Captura.PNG

el error dice esto

Ocurrió un error en la consulta ». Expression.Error: No había suficientes elementos en la enumeración para completar la operación.
Detalles:
Tabla

Gracias

Miguel

ImkeF

En respuesta a masplin

Sí, porque mi comprensión de su situación no era correcta: en la imagen puedo ver que el error ya se debe a su función y no al paso que ha mencionado.

Entonces, podría poner en la ruta «de lo contrario» una tabla vacía en su lugar:

#"In Tabelle konvertiert" = try Table.FromList(  #"Added Custom1", Splitter.SplitByNothing(), null, null, ExtraValues.Error) otherwise  #table({}, {{}}),

masplin

En respuesta a ImkeF

Lo siento Imke estoy siendo bastante estúpido. Agregué esa línea y ahora obtengo solo una celda y perdí las 200 filas de mi tabla. Como usted dice, el error en realidad se debe a la función a la que llamo en la etapa de navegación.

Captura.PNG

ImkeF

En respuesta a masplin

No hay problema, denada.

Sí, no le presté suficiente atención. Este paso parece inútil, deberías eliminarlo.

Luego ajuste el siguiente paso así:

Paso 2 = Table.AddColumn(#»In Tabelle konvertiert», «Custom», each tratar Tabla.AddColumn([Column1]»Ficticio», cada 1) de lo contrario #tabla({«TextoConvertido»}, {{[Column1]}})),

Entonces, en lugar de usar if then else (que no le permitirá deshacerse del error), use el controlador de errores e intente ejecutar un comando en una tabla (aquí agregué una columna ficticia que luego puede eliminar, pero puede reemplazarlo fácilmente por una conversión de formato en una columna existente, entonces no tiene que revertir esta operación).

masplin

En respuesta a ImkeF

No estoy seguro de qué es una conversión de formato. Tampoco estoy seguro de poner los pasos en el orden correcto, ya que todo se fragmenta un poco. Tengo este código que ahora me da una columna «Custom10» donde los «Error» ahora son todos «Tabla». No estoy seguro de qué es «Columna1».

let

    Source = Excel.Workbook(File.Contents("U:DropboxLimerstonCrawfordCRO Companies.xlsx"), null, true),
    CRO_Company_Table = Source{[Item="CRO_Company",Kind="Table"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(CRO_Company_Table,{{"Company", type text}, {"Address", type text}, {"Search", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Web_Main([Search])),
    #"Sorted Rows1" = Table.Sort(#"Added Custom",{{"Company", Order.Ascending}}),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Sorted Rows1", "Custom", {"#(lf)Website#(lf)", "#(lf)Headquarters#(lf)", "#(lf)Laboratories#(lf)", "#(lf)Company Type#(lf)", "#(lf)Certifications#(lf)", "#(lf)Year Established#(lf)", "#(lf)No. of Employees#(lf)"}, {"#(lf)Website#(lf)", "#(lf)Headquarters#(lf)", "#(lf)Laboratories#(lf)", "#(lf)Company Type#(lf)", "#(lf)Certifications#(lf)", "#(lf)Year Established#(lf)", "#(lf)No. of Employees#(lf)"}),
    #"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Custom",  each Web_Description([Search])),
    Step2 = Table.AddColumn( #"Added Custom1", "Custom10", each try Table.AddColumn([Column1], "Dummy", each 1) otherwise #table({"ConvertedText"}, {{[Column1]}}))
in
    Step2

Sin embargo, si trato de expandir esta columna obtengo

Expression.Error: No se encontró el campo ‘Columna1’ del registro.
Detalles:
Empresa=3Cerebro
Dirección=3Brain GmbH Schulstrasse 76 7302 Landquart Suiza
Buscar=3cerebro

Sitio web
=3brain.com

Sede

lo siento por ser tenue, pero parece que estás cerca de la solución, solo que mi «M» es demasiado pobre para entenderlo 🙂

nhoff

En respuesta a ImkeF

Muchas gracias, este enfoque funcionó.

No seguí por completo el código del paso addcolumn, donde hay una referencia a #table({«ConvertedText»} – ¿dónde hizo eso? ¿viene de?

Sin embargo, logré copiar y reemplazar con mis propios valores y funcionó.

ImkeF

En respuesta a nhoff

Genial que lo hayas hecho funcionar.

Esa es la parte donde el texto se convierte en una tabla. «ConvertedText» es solo el nombre de columna que elijo (ya que no debe ser un nombre que ya exista en las otras columnas de la tabla; de lo contrario, el paso de expansión con nombres de columna dinámicos no funcionaría).

Anónimo

En respuesta a ImkeF

Hola,

Estoy teniendo este mismo problema. ¿En qué punto del editor avanzado necesito insertar su código?

Perdón por la pregunta tonta, pero soy nuevo en Power BI.

Gracias

Miguel

ImkeF

En respuesta a Anónimo

Hola Mike,

por favor, echa un vistazo si este video te ayuda:

Si no, por favor regrese e intentaré de manera diferente.

¡Gracias!

Anónimo

En respuesta a ImkeF

Hola ImkeF.

He insertado su código en una nueva consulta. ¿Solo necesito cambiar la fuente a mi fuente?

No estoy seguro de modificar su código para que funcione en mis datos de origen.

Perdón por las preguntas tontas, ¡soy nuevo en Power BI!

Saludos

Miguel

Deja un comentario

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