Cargue una matriz JSON de valores con nombres de campo en otro elemento

Un usuario Pregunto ✅

Anónimo

Hola a todos,

Tengo JSON que contiene una representación de objetos de la tabla de registros.

El objeto JSON tiene dos propiedades, «campos» y «resultados».

La propiedad «fields» contiene una matriz de objetos que definen la lista de columnas y su tipo de datos

La propiedad «resultados» contiene registros, cada uno de los cuales consta de una matriz de valores correspondientes a las columnas en la matriz «campos».

{
    "fields": [
        {
            "field": "field1",
            "type": "string"
        },
        {
            "field": "field2",
            "type": "string"
        },
        {
            "field": "field3",
            "type": "integer"
        },
        {
            "field": "eventTimestamp",
            "type": "date"
        }
    ],
    "results": [
        [
            "field1value1",
            "field2value1",
            10,
            "2018-05-31T22:55:31.187+0000"
        ],
        [
            "field1value2",
            "field2value2",
            20,
            "2018-05-31T22:55:31.187+0000"
        ],
        [
            "field1value3",
            "field2value3",
            30,
            "2018-05-31T22:55:31.187+0000"
        ]
    ]
}

Mi objetivo es analizar estos datos en un conjunto de datos con esa forma con la siguiente tabla:

field1          field2          field3      eventTimestamp
field1value1    field2value1    10          2018-05-31T22:55:31.187+0000
field1value2    field2value2    20          2018-05-31T22:55:31.187+0000
field1value3    field2value3    30          2018-05-31T22:55:31.187+0000

Puedo expandir la tabla de «campos» sin ningún problema:

let
    Source = Json.Document(File.Contents("C:testTestJSON.json")),
    fields = Source[fields],
    #"Converted to Table" = Table.FromList(fields, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"label", "field", "type"}, {"label", "field", "type"})
in
    #"Expanded Column1"

tabla de campos.png

Sin embargo, no estoy seguro de cómo expandir la matriz de valores en la tabla con las columnas.

puedo hacer Table.TransformColumns:

let
    Source = Json.Document(File.Contents("C:testTestJSON.json")),
    results = Source[results],
    #"Converted to Table" = Table.FromList(results, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Extracted Values" = Table.TransformColumns(#"Converted to Table", {"Column1", each Text.Combine(List.Transform(_, Text.From)), type text})
in
    #"Extracted Values"

… y produce una sola columna con valores unidos:

TransformarColumnas.png

yo también puedo hacer Tabla.ExpandListColumn:

let
    Source = Json.Document(File.Contents("C:testTestJSON.json")),
    results = Source[results],
    #"Converted to Table" = Table.FromList(results, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandListColumn(#"Converted to Table", "Column1")
in
    #"Expanded Column1"

pero produce varias filas para una sola columna, una para cada registro:

ExpandListColumn.png

Lo que realmente quiero es crear varias columnas a partir de valores.

Si estuviera escribiendo esto en C #, crearía una tabla con columnas de «campos», y luego recorrería los objetos en la matriz de «resultados», y cargaría una tabla con columnas por posición.

Mi M no es muy bueno todavía. ¿Cómo puedo hacer esto aquí?

¡Gracias!

Daniel

Hola @Anonimo,

Puede consultar la muestra a continuación para convertir los datos de origen. (Adjunto el archivo de muestra a continuación)

15 PNG

Saludos,

Xiaoxin-sheng

Hola @Anonimo,

Puede consultar la muestra a continuación para convertir los datos de origen. (Adjunto el archivo de muestra a continuación)

15 PNG

Saludos,

Xiaoxin-sheng

Anónimo

En respuesta a v-shex-msft

Muchísimas gracias.

Muy interesante sobre el uso de «cada Table.Transpose» para crear una tabla a partir de la matriz de «valores».

Otra gran cosa nueva para mí es usar la función List.Zip para pasar la lista de nombres de columna de «campos» como entrada para nombres de columna para «valores».

Finalmente, me gusta la función personalizada para analizar el tipo de datos del valor en la lista de «valores» para usar como entrada para el tipo de datos de la columna.

¡Esto ayuda mucho!

Daniel

Deja un comentario

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