Dividir la lista de estructura de datos de elementos múltiples en filas separadas

Un usuario Pregunto ✅

garycarters

Hola a todos

Tengo una tabla que contiene varios registros de control. Cada registro de control puede dictar el comportamiento de un aspecto de nuestro sistema y puede ser una cadena, un indicador, un nombre de archivo o una lista de datos. Mi pregunta se relaciona con los registros que definen listas de datos.

Las listas de datos comprenden un prefijo («Lista:») seguido de una lista de índices y descripciones. Por ejemplo;

Lista: «1», «Descripción 1», «1», «Descripción 1», «2», «Descripción 2», «3», «Descripción 3», etc.

Quiero acceder a esas descripciones según el índice utilizado por el registro del cliente: cada cliente está adjunto a un índice en el registro del cliente.

¿Cómo puedo dividir la lista en una tabla de índice, descripción? Intenté usar Split Column por delimitador que funciona pero da una fila en la salida para cada elemento;

1

Descripción 1

2

Descripción 2

3

Descripción 3

etc.

sólo quiero

1 Descripción 1

2 Descripción 2

3 Descripción 3

etc.

Luego puedo unir el índice de clientes al índice de descripción.

AIT

mariusz

En respuesta a garycarters

Hola @garycarters

1. Crear nueva fuente >> Consulta en blanco

2. Vaya al Editor avanzado y pegue el código de función proporcionado.

3. En su tabla, vaya a la cinta Agregar columna y busque Invocar función personalizada

4. En la sección Consulta de función, seleccione la función que ha creado (muy probablemente Consulta1 si no ha cambiado el nombre).

5. En la sección de su columna, cambie ABC a Nombre de columna y seleccione ListData de la lista desplegable, luego presione OK para confirmar.

6. Ahora debería tener una columna adicional en su tabla que se puede expandir con:

  • Haciendo clic dentro de la celda en «Tabla»
  • Si desea expandir la tabla original, haga clic en la flecha doble en el encabezado de la columna y seleccione las columnas que desea agregar
Atentamente,
mariusz

Por favor, siéntase libre de conectarse conmigo.
mariusz repczynski

mariusz

Hola @garycarters

Puede usar la siguiente sintaxis M

let
    Source = {"1","Description 1", "1","Description 1", "2","Description 2", "3","Description 3"},
    Split = List.Split( Source,  2 ), 
    Output = #table( type table [ ID = Int64.Type, Description = text ], Split )
in
    Output

Saludos,
mariusz

Si esta publicación le ayuda, considere aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

sohananahid

En respuesta a mariusz

Hola @Mariusz: Buen día. Vi esta publicación. Tengo un problema con una lista, «ubicaciones» que quiero dividir en 2 columnas: ID de ubicación y nombre de ubicación. He publicado esto en:

https://community.powerbi.com/t5/Desktop/Split-a-Single-Column-with-delimiter-colon/mp/1430799/high…

Muchas gracias de antemano.

garycarters

En respuesta a mariusz

Hola Mariusz

Gracias por eso, parece prometedor.

He ingresado el código como se muestra a continuación. Sin embargo,

= let
    Source = Sql.Database("calsql", "mcsrm_live"),
    dbo_spec_checklist_items = Source{[Schema="dbo",Item="spec_checklist_items"]}[Data],
    #"Filtered Rows" = Table.SelectRows(dbo_spec_checklist_items, each ([id] = 57)),
    #"Extracted Text Range" = Table.TransformColumns(#"Filtered Rows", {{"ListData", each Text.Middle(_, 5, 200000), type text}}),
    Split = List.Split( "Extracted Text Range", 2 ),
    Output = #table( type table [ ID = Int64.Type, Description = text ], Split )
in
    #"Extracted Text Range"

Sin embargo, cuando observo una vista previa de los resultados, solo muestra un único registro.

Obviamente me estoy perdiendo algo simple…

mariusz

En respuesta a garycarters

Hola @garycarters

Mala mía, creo que me perdí un par de pasos.

let
    Source = " List:""1"",""Description 1"", ""1"",""Description 1"", ""2"",""Description 2"", ""3"",""Description 3""",
    #"Text Clean1" = Text.Replace(Source, """", ""),
    #"Text Clean2" = Text.Replace( #"Text Clean1", "List:", ""),
    #"Text Split" = Text.Split( #"Text Clean2", "," ),
    #"List Split" = List.Split( #"Text Split", 2 ),
    #"List to Table" = #table( type table [ ID = Int64.Type, Description = text ], #"List Split" ),
    #"Changed Type" = Table.TransformColumnTypes(#"List to Table",{{"ID", Int64.Type}})
in
    #"Changed Type"

Saludos,
mariusz

Si esta publicación le ayuda, considere aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

garycarters

En respuesta a mariusz

Nos estamos acercando.

El siguiente código da error

«Expresión.Error: no podemos convertir un valor de tipo Tabla a tipo Texto.
Detalles:
Valor=Tabla
Tipo=Tipo»

Creo que el malentendido es que los datos de la lista provienen de una columna en la tabla spec_checklist_items, su ejemplo tiene una cadena.

let
    Source = Sql.Database("calsql", "mcsrm_live"),
    dbo_spec_checklist_items = Source{[Schema="dbo",Item="spec_checklist_items"]}[Data],
    #"Filtered Rows" = Table.SelectRows(dbo_spec_checklist_items, each ([id] = 57)),
    #"Text Clean1" = Text.Replace(#"Filtered Rows", """", ""),
    #"Text Clean2" = Text.Replace( #"Text Clean1", "List:", ""),
    #"Text Split" = Text.Split( #"Text Clean2", "," ),
    #"List Split" = List.Split( #"Text Split", 2 ),
    #"List to Table" = #table( type table [ ID = Int64.Type, Description = text ], #"List Split" ),
    #"Changed Type" = Table.TransformColumnTypes(#"List to Table",{{"ID", Int64.Type}})
in
    #"Changed Type"

mariusz

En respuesta a garycarters

Hola @garycarters

¿Puede enviar una muestra de su tabla con pocas filas?

Gracias
mariusz

garycarters

En respuesta a mariusz

Es un registro único, que contiene la lista delimitada de identificaciones y descripciones en un campo, además de varios otros fragmentos de información que no me interesan.

mariusz

En respuesta a garycarters

Hola @garycarters

Lo convertí en una función, puede invocarlo en su tabla y pasar la columna como parámetro.

(#"Your Column" as text ) => let
    #"Text Clean1" = Text.Replace(#"Your Column", """", ""),
    #"Text Clean2" = Text.Replace( #"Text Clean1", "List:", ""),
    #"Text Split" = Text.Split( #"Text Clean2", "," ),
    #"List Split" = List.Split( #"Text Split", 2 ),
    #"List to Table" = #table( type table [ ID = Int64.Type, Description = text ], #"List Split" ),
    #"Changed Type" = Table.TransformColumnTypes(#"List to Table",{{"ID", Int64.Type}})
in
    #"Changed Type"

Saludos,
mariusz

Si esta publicación le ayuda, considere aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

garycarters

En respuesta a mariusz

¡Nunca hubiera llegado allí sin tu ayuda! Eso funciona maravillosamente.

Gracias Mariusz

garycarters

En respuesta a mariusz

Lo siento, he estado fuera por un par de días.

Mi consulta de tabla ahora es esto;

let
    Source = Sql.Database("calsql", "mcsrm_live"),
    dbo_spec_checklist_items = Source{[Schema="dbo",Item="spec_checklist_items"]}[Data],
    #"Filtered Rows" = Table.SelectRows(dbo_spec_checklist_items, each ([id] = 57)),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"charge_item", "doc_path", "used_for_equipment", "used_for_contracts", "used_for_works_orders", "view_from_web", "used_for_customers", "used_for_suppliers", "used_for_employees", "SpecificationAutoCreate", "SpecificationMandatory", "UsedForPurchaseOrders", "UsedForPATTests", "UsedForQuotes", "UsedForPODistributions", "UsedForContacts", "UsedForProspects", "UsedForInvoices", "Redact", "UsedForJobs", "UsedForCases"}),
    #"Extracted ListData" = Table.TransformColumns(#"Removed Columns", {{"ListData", each Text.Middle(_, 5, 200000), type text}})
in
    #"Extracted ListData"

Column ListData ahora contiene la lista de valores que deseo dividir en Filas de 2 columnas (ID y descripción).

Creé una columna personalizada con el código que proporcionó

Captura.PNG

¿Cómo invoco la función que ha proporcionado desde aquí para obtener las filas/columnas que describí originalmente? Todo esto es un terreno nuevo (pero muy emocionante) para mí.

mariusz

En respuesta a garycarters

Hola @garycarters

1. Crear nueva fuente >> Consulta en blanco

2. Vaya al Editor avanzado y pegue el código de función proporcionado.

3. En su tabla, vaya a la cinta Agregar columna y busque Invocar función personalizada

4. En la sección Consulta de función, seleccione la función que ha creado (muy probablemente Consulta1 si no ha cambiado el nombre).

5. En la sección de su columna, cambie ABC a Nombre de columna y seleccione ListData de la lista desplegable, luego presione OK para confirmar.

6. Ahora debería tener una columna adicional en su tabla que se puede expandir con:

  • Haciendo clic dentro de la celda en «Tabla»
  • Si desea expandir la tabla original, haga clic en la flecha doble en el encabezado de la columna y seleccione las columnas que desea agregar
Atentamente,
mariusz

Por favor, siéntase libre de conectarse conmigo.
mariusz repczynski

Deja un comentario

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