循环遍历 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 中的 Smartsheet 数据