将单元格值输入Excel查询Web浏览器URL

时间:2017-12-28 22:57:33

标签: excel powerquery

我的问题:

  1. 通过New Query -> From Other Sources -> From Web,我输入了一个静态网址,允许我以JSON格式从网页加载大约60k“ID”。

    • 我相信这些ID中的每一个都对应一个项目。
    • 因此,它们全部加载并组织在一个列中,每行有一个ID,位于“查询”选项卡中。
    • 目前,没问题。
  2. 现在我需要从依赖于ID的动态URL导入信息。

    • 所以我需要以这种形式从URL导入:

      http://www.example.com/xxx/xxxx/ID
      
    • 为每个ID导入以下内容:
      • 对应项目的名称,
      • 平均价格,
      • 供应,
      • 需求,
  3. 经过研究,我得出的结论是,我必须使用查询编辑器中的“高级编辑器”来引用ID查询选项卡。

    • 但是我不知道如何将静态部分与ID放在一起,以及如何在60k行上重复这一点。
  4. 我试过了:

    let
        Source = Json.Document(Web.Contents("https://example.com/xx/xxxx/" & ID)),
        name1 = Source[name]
    in
        name1
    

    这会返回错误。

    我认为这是因为我无法添加字符串和列。

    问题:如何引用我感兴趣的单元格的值并将其添加到我的字符串中?

    问题:我正在做什么?

    问题: Excel如何处理加载60k查询?

    • 每个查询只需要导入几个字。

    问题:是否可以通过一个查询从60k个不同的网址加载信息?

    编辑:非常感谢Alexis的回答,非常乐于助人。所以为了避免复制你发布的内容,我没有使用该功能(告诉我你的想法):

    let
        Source = Json.Document(Web.Contents("https://example.com/all-ID.json")),
        items1 = Source[items],
        #"Converted to Table" = Table.FromList(items1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "ID"}}),
        #"Inserted Merged Column" = Table.AddColumn(#"Renamed Columns", "URL", each Text.Combine({"http://example.com/api/item/", Text.From([ID], "fr-FR")}), type text),
        #"Added Custom" = Table.AddColumn(#"Inserted Merged Column", "Item", each Json.Document(Web.Contents([URL]))),
        #"Expanded Item" = Table.ExpandRecordColumn(#"Added Custom", "Item", {"name"}, {"Item.name"})
    in
        #"Expanded Item"
    

    现在我遇到的问题是,从所有网址加载我需要的所有信息需要很长时间。

    事实证明,可以使用以下格式从多个 ID中提取:http://example.com/api/item/ID1,ID2,ID3,ID4,...,IDN

    我认为尝试从包含所有ID的URL加载一次就不会有效,因为URL会包含太多要处理的字符。

    所以为了加快速度,我现在要做的就是将每个第N行连接成一个单元格,例如N = 3:

    205
    651
    320165
    63156
    4645
    31
    6351
    561
    561
    31
    35
    

    会变成:

    205, 651, 320165
    63156, 4645, 31
    6351, 561, 561
    31, 35
    

    “分组依据”功能似乎不是我想要的,我不知道如何通过Power Query自动化

    编辑2

    经过大量测试后我找到了一个解决方案,即使它可能不是最优雅和最优的:

    • 我用1步
    • 创建了一个索引
    • 我创建了另一个costum列,我将每N行与N递增数相关联
    • 我用过“分组依据” - > “所有行”创建“计数”列
    • 创建了一个costum列“[Count] [ID]
    • 最后,我从该列中删除了值并添加了“,”分隔符

    这是N = 10 000的代码:

    let
        Source = Json.Document(Web.Contents("https://example.com/items.json")),
        items1 = Source[items],
        #"Converted to Table" = Table.FromList(items1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "ID"}}),
        #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"ID", Int64.Type}}),
        #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
        #"Added Conditional Column" = Table.AddColumn(#"Added Index", "Custom", each if Number.RoundDown([Index]/10000) = [Index]/10000 then [Index] else Number.IntegerDivide([Index],10000)*10000),
        #"Reordered Columns" = Table.ReorderColumns(#"Added Conditional Column",{"Index", "ID", "Custom"}),
        #"Grouped Rows" = Table.Group(#"Reordered Columns", {"Custom"}, {{"Count", each _, type table}}),
        #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom.1", each [Count][ID]),
        #"Extracted Values" = Table.TransformColumns(#"Added Custom", {"Custom.1", each Text.Combine(List.Transform(_, Text.From), ","), type text})
    in
        #"Extracted Values"
    

1 个答案:

答案 0 :(得分:0)

我认为你想要做的是创建一个你用每个ID值调用的自定义函数。

让我举一个类似的例子,指出你正确的方向。

假设我有一个名为DELETE FROM users WHERE id = 25 的表,如下所示:

ListIDs

对于每个ID,我想从维基百科中提取一些信息(例如ID = 6我想查找mailgun API并返回6的红衣主教,序数,因子分解和除数。)

要仅为一个ID值获取此值,我的查询将如下所示(再次使用6):

ID
----
1
2
3
4
5
6
7
8
9
10

现在我们想将它转换为一个函数,以便我们可以根据需要多次使用它而无需创建一堆查询。 (注意:我也将此查询/函数命名为WikiLookUp。)为此,请将其更改为以下内容:

let
    Source = Web.Page(Web.Contents("https://en.wikipedia.org/wiki/6")),
    Data0 = Source{0}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Column2] = "Cardinal" or [Column2] = "Divisors" or [Column2] = "Factorization" or [Column2] = "Ordinal")),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Column1"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Column2", "Property"}, {"Column3", "Value"}}),
    #"Pivoted Column" = Table.Pivot(#"Renamed Columns", List.Distinct(#"Renamed Columns"[Property]), "Property", "Value")
in
    #"Pivoted Column"

请注意,我们所做的只是将其包装在另一组let WikiLookUp = (ID as text) => let Source = Web.Page(Web.Contents("https://en.wikipedia.org/wiki/" & ID)), Data0 = Source{0}[Data], #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}}), #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Column2] = "Cardinal" or [Column2] = "Divisors" or [Column2] = "Factorization" or [Column2] = "Ordinal")), #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Column1"}), #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Column2", "Property"}, {"Column3", "Value"}}), #"Pivoted Column" = Table.Pivot(#"Renamed Columns", List.Distinct(#"Renamed Columns"[Property]), "Property", "Value") in #"Pivoted Column" in WikiLookUp 中,并定义参数let...in,该参数将被替换为接近结尾的ID = text行。该功能应如下所示:

https://en.wikipedia.org/wiki/6

现在我们可以回到我们已导入查询编辑器的表中,并在自定义列中调用我们新创建的函数。 (注意:请确保首先将ID值转换为文本类型,因为它们会被附加到URL。)

使用以下定义添加自定义列(或使用“调用自定义函数”按钮)

Source

展开该列以引入您想要的所有列,然后就完成了!

以下是该查询的M代码:

= WikiLookUp([ID])

查询应如下所示:

WikiLookUp Function