循环遍历 Excel Power Query 中的 Json 列表以检索记录

Posted

技术标签:

【中文标题】循环遍历 Excel Power Query 中的 Json 列表以检索记录【英文标题】:Loop through Json List in Excel Power Query to retrieve record 【发布时间】:2021-12-03 22:12:37 【问题描述】:

我有一个强大的查询,它调用 Google Maps API 并像这样返回 Json

let
    baseurl = "https://maps.googleapis.com/maps/api/geocode/json?",
    cellAddress = Excel.CurrentWorkbook()[Name="Address"][Content]0[Column1],
    stepOneAdress = Replacer.ReplaceText(cellAddress, "Addrs: ", ""),
    noSpaceAdress = Replacer.ReplaceText(stepOneAdress, " ", "%20"),
    noCommasAdress = Replacer.ReplaceText(noSpaceAdress, ",", "%2C"),
    fullUrl = baseurl&"address="&noCommasAdress&"&key=AIzaSyCwcLo1bl8iTSWhU3vgHNuq3rJHbSGH-Pw",

    webdata = Web.Contents(fullUrl),

    response = Json.Document(webdata),
    results = response[results],
    data = results0
    
in
    data

数据是这样的


   "results" : [
      
         "address_components" : [
            
               "long_name" : "Steamboat Springs",
               "short_name" : "Steamboat Springs",
               "types" : [ "locality", "political" ]
            ,
            
               "long_name" : "Routt County",
               "short_name" : "Routt County",
               "types" : [ "administrative_area_level_2", "political" ]
            ,
            
               "long_name" : "Colorado",
               "short_name" : "CO",
               "types" : [ "administrative_area_level_1", "political" ]
            ,
            
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            ,
            
               "long_name" : "80487",
               "short_name" : "80487",
               "types" : [ "postal_code" ]
            
         ],
         "formatted_address" : "Steamboat Springs, CO 80487, USA",
         "geometry" : 
            "bounds" : 
               "northeast" : 
                  "lat" : 40.5286781,
                  "lng" : -106.7801651
               ,
               "southwest" : 
                  "lat" : 40.439399,
                  "lng" : -106.886848
               
            ,
            "location" : 
               "lat" : 40.4849769,
               "lng" : -106.8317158
            ,
            "location_type" : "APPROXIMATE",
            "viewport" : 
               "northeast" : 
                  "lat" : 40.5286781,
                  "lng" : -106.7801651
               ,
               "southwest" : 
                  "lat" : 40.439399,
                  "lng" : -106.886848
               
            
         ,
         "place_id" : "ChIJYUZWCYF7QocRfc9uSNGjqBs",
         "types" : [ "locality", "political" ]
      
   ],
   "status" : "OK"

然后我可以在另一个电源查询中从该电源查询中读取“数据”,我正在尝试获取邮政编码数据。

let
    data = Coordinates,
    address_components = data[address_components],
    address_components1 = address_components6
in
    address_components1

address_component1(我知道可怕的名字,但仍在原型设计) 是一个 Json 记录,然后被另一个查询使用。

但是 Json 列表中的值是硬编码的,您可以看到它是列表中的第六项。但是我发现我想要的邮政编码并不总是在列表中的第六位。

记录中有一个类型列表,我想读取并确定类型是否等于“postal_code”

我不知道如何遍历列表并检查每个项目。

我希望它是类似的东西

address_component1,
foreach(item in address_components)
   type_list = item["types"],
   if type_list = "postal_code"
      address_component1 = item,

可以这样循环吗?

【问题讨论】:

【参考方案1】:

如果,事实上,你的 json 就像你展示的那样,关于:

单个邮政编码元素 包含一个邮政编码

您可以使用以下代码提取它:

首先将address_components 提取到记录列表中 查看每条记录以查看types 中的第一个元素是否为postal_code 如果是,则返回long_name

如果 json 包含多个 postal_code,则可能需要不同的算法。

let
    Source = Json.Document(File.Contents("C:\Users\ron\Desktop\new 3.json")),

//extract the address_components
    address_components = Source[results]0[address_components],

//find the postal code and extract it
    postalCode=List.Accumulate(address_components,"", (state, current)=>
         if Record.Field(current,"types")0 = "postal_code" then state & Record.Field(current,"long_name") else state)
in
    postalCode

postalCode 将包含邮政编码作为文本字符串。

【讨论】:

以上是关于循环遍历 Excel Power Query 中的 Json 列表以检索记录的主要内容,如果未能解决你的问题,请参考以下文章

Power Query Excel 中的覆盖/锁定值

通过 Power Query 在 Excel 中的 Smartsheet 数据

Power Query Editor (Excel) - 错误处理 API 提要中的无数据

如何在Power Query中提取数据?——数值篇

Excel Power Query导入MySQL数据

通过 Power Query 将 Excel 连接到 Smartsheet