迭代Power Query中列中的每个单元格

时间:2018-05-24 11:51:21

标签: powerquery

我创建了一个名为Table3的表,其中两列名为URL,为空,Value包含一个网站列表。以下查询从表3中存储的网站检索数据。

let
    Parameter = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
    URL= Parameter{1}[Value],
    Source = Web.Page(Web.Contents(URL)),
    Data0 = Source{0}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Date", type date}, {"Open", type number}, {"High", type number}, {"Low", type number}, {"Close", type number}, {"Volume", type number}, {"Market Cap", type number}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Market Cap", "Open", "High", "Low"}),
    #"Sorted Rows" = Table.Sort(#"Removed Columns",{{"Date", Order.Ascending}})
in
    #"Sorted Rows" 

第二行在“值”列中运行第一个网站的查询。

是否可以引入一个循环来运行所有网站的查询?

如果没有,是否可以通过手动粘贴上述代码并更改每个网站括号中的数字来按顺序运行所有网站的查询?

如果有可能我认为它会在同一张表中加载内容,有没有办法在每次迭代中将内容加载到不同的表格中?

感谢您阅读我的问题。

1 个答案:

答案 0 :(得分:2)

在Power Query中,循环并不是真正的东西,但你仍然可以做你想要的事情。我不知道你要从哪些网址中提取,所以让我举一个使用公开网址的例子。

我们假设我的Table3如下:

URL
--------
https://finance.yahoo.com/quote/AAPL?p=AAPL
https://finance.yahoo.com/quote/AAPL?p=GOOG

我可以将其加载到查询编辑器中,并创建一个自定义列,用于读取每个URL的网页。

= Web.Page(Web.Contents([URL])){0}[Data]

(我想要的表是第一个(因此是{0}行索引)并且在[Data]列中。)

现在我有一个这样的表,其中底部表格是我选择的单元格的预览。

Preview Table

单击箭头图标以展开表格。

Expand Tables

您可以在此处过滤Column1以选择您感兴趣的值(例如AskBidOpenVolume)和然后转动该列(Transform> Pivot Column)。选择Column2作为值列,然后在高级选项下选择“不聚合”。

Pivot Column

结果应该是您在数据透视对话框上方看到的表格。

以下是在高级编辑器中显示的查询的完整M代码

let
    Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"URL", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Web.Page(Web.Contents([URL])){0}[Data]),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Column1", "Column2"}, {"Column1", "Column2"}),
    #"Filtered Rows" = Table.SelectRows(#"Expanded Custom", each ([Column1] = "Ask" or [Column1] = "Bid" or [Column1] = "Open" or [Column1] = "Volume")),
    #"Pivoted Column" = Table.Pivot(#"Filtered Rows", List.Distinct(#"Filtered Rows"[Column1]), "Column1", "Column2")
in
    #"Pivoted Column"