使用Power Query和JSON转换记录

时间:2018-09-27 12:53:25

标签: json excel powerquery

我正在Excel 2013上使用Power Query将巨大的JSON文件(大于100Mb)转换为纯Excel工作表。

除一个字段外,所有字段均已正确转换,但是有一个特定字段被识别为记录。所有其他字段具有固定的文本值或用逗号分隔的值,因此转换非常容易,此字段内部具有JSON记录结构,因此“ Field”:“ Value”。

这是文件的摘录:

    {
    "idTrad": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "images": {
        "1": "SE1.JPG",
        "2": "SE2.JPG"
    },
    "date": "2018-09-22",
    "category": "MD",
    "value": "Original text",
    "language": "IT",
    "contexts": [
        ""
    ],
    "label": "Translated text",
    "variantes": "1,23,45,23,32,232,2315,23131",
    "theme": [
        "XX_XXX"
    ]
}

有问题的字段是“图像”,因为它被识别为记录,在结果表中我遇到这种情况:

[1]: https://i.stack.imgur.com/EnHow.png

到目前为止,我的查询是:

    let

    Source = Json.Document(File.Contents("filename.json")),

 #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),

    #"Column1 développé" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"value", "contexts", "theme", "variantes", "category", "label", "language", "idTrad","images", "date"}, {"Column1.value", "Column1.contexts", "Column1.theme", "Column1.variantes", "Column1.category", "Column1.label", "Column1.language", "Column1.idTrad","Column1.images", "Column1.date"}),

    #"Valeurs extraites" = Table.TransformColumns(#"Column1 développé", {"Column1.contexts", each Text.Combine(List.Transform(_, Text.From), ","), type text}),

   #"Valeurs extraites1" = Table.TransformColumns(#"Valeurs extraites", {"Column1.theme", each Text.Combine(List.Transform(_, Text.From), ","), type text})


in    

    #"Valeurs extraites1"

我想在图像字段中使用记录的文本表示形式,例如“ 1:SE1.JPG,2:SE2.JPG”,有什么想法吗?

1 个答案:

答案 0 :(得分:0)

当然,您甚至可以一步一步完成!如果将记录转换为表(Record.ToTable),它将创建一个表,其中记录中的字段名称位于“名称”列中,而值位于“值”列中。这样,您可以从json文件中获取“ 1”,“ 2”等。从那里,您可以将列合并为所需的文本,然后像在其余列中所做的那样转换并合并列表。

=IF(AND(LEFT(C1,8)="https://", RIGHT(C1,4)=".jpg"),C1,"")

我认为Record.ToTable不会将其列名本地化,但也许可以通过先将记录转换为表以查看其作用来进行测试。

= Table.TransformColumns(#"Valeurs extraites1",{"Column1.images", 
each 
Text.Combine(
 Table.ToList(
  Table.CombineColumns(
   Record.ToTable(_)
  ,{"Name", "Value"},Combiner.CombineTextByDelimiter(": ", QuoteStyle.None),"Merged")
 )
, ", ")
})