嵌套加载文件夹路径 Power Query

Nest Load a folder path Power Query

我正在尝试使用 Excel Power Query(卡在 Excel 2010 中)来检查名为 "SWPPP" 的文件夹是否位于目录列表中, 里面有文件。

文件夹结构如下

|O:\Planning Projects
|---2012\
|--------00-000 A Custom Folder Name\
|------------------------------------\SWPPP
|---2013\
|--------00-000 A Custom Folder Name\
|------------------------------------\SWPPP
|---2014\
|--------00-000 A Custom Folder Name\
|------------------------------------\SWPPP
|---2015\
|--------PB-391-000 A Custom Folder Name\
|------------------------------------\SWPPP
|--------10-000 Another Custom Folder Name\
|------------------------------------\SWPPP
|---2016\
|--------00-000 A Custom Folder Name\
|------------------------------------\SWPPP
|--------10-300 Another Custom Folder Name\
|------------------------------------\SWPPP
|---2017\
|--------00-000 A Custom Folder Name\
|------------------------------------\SWPPP
|--------10-000 Another Custom Folder Name\
|------------------------------------\SWPPP
|---Fill Permits\
|--------These folders I don't care about\
|--------Another Folder I don't care about\
|---Pat's Inspections\
|--------These folders I don't care about\
|--------Another Folder I don't care about\

从根目录 (O:\Planning Projects),我只对 "year" 文件夹内的文件夹感兴趣(例如:2012、2013、2014...)。里面有600多个子目录(接近700个),而且会随着时间的推移不断增长。我正在尝试尽可能地自动化和面向未来。

我需要的是进入每个 "year" 文件夹,进入子文件夹,检查是否有 "SWPPP" 文件夹,然后检查是否有任何文件它。

我快要完成了,但有一部分我卡住了。我得到了臭名昭著的:

Formula.Firewall: Query 'Query1' (step 'loadedFiles') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.

在继续之前,我已经完成了研究并访问了几个网站:

https://www.excelguru.ca/blog/2015/03/11/power-query-errors-please-rebuild-this-data-combination/

https://community.powerbi.com/t5/Desktop/Formula-Firewall-Query-references-other-queries-so-it-may-not/td-p/18619

Power Query - Please rebuild this data combination

这是我遵循的程序:

  1. 1.I加载根目录。 (O:\Planning Projects)
  2. 做一些逻辑将 "years" 文件夹放入列表中:{2012、2013、2014 等}\
  3. 从列表中,我迭代并获取每个列表中的目录。 (到目前为止,一切都很好)
    1. 现在,我尝试将 "SWPPP" 附加到文件夹结构,并尝试从文件夹中获取内容。那就是我被击中的地方 有错误。

我尝试按照 excelguru.ca 的建议,在不同的部分打破算法,但这没有做任何事情。

我的第二种方法:

  1. 重复上一过程中的步骤 1 -3。
  2. 将目录加载到 Excel(参见步骤 3),然后串联 "SWPPP" 在我创建的自定义 table 中。
  3. 使用 Power Query 的导入将自定义 table 加载到新查询中 Excel 文件(通过导入相同的文件)。
  4. 我再次尝试读取文件,但它给了我同样的错误。

我正在使用 m 编程语言将所有内容放在一起(需要一些帮助,只知道一天),但我被卡住了。

这是第二种方法:

第一个查询从 "year" 文件夹加载所有子目录。

Query Name: "LoadInspections"
let
    Url = "O:\Planning Projects",
    Source = Folder.Contents(Url),
    Cols = Table.SelectColumns(Source, "Name"),
    ColsList = Table.ToList(Cols),
    Cond = (val) => try not Number.IsNaN(Number.FromText(val)) otherwise false,
    Years = List.Select(ColsList, (val) => val = "pre 2012" or Cond(val)),
    load = List.Transform(Years, (val) => Folder.Contents(Url & "\" & val)),
    combinedTables = Table.Combine(load)

in
  combinedTables

这是加载我在 Excel 中创建的自定义 table 的查询,它将目录与 "SWPPP":

连接起来
Query Name: ApplicationNumber_Files_Folders

let
    Source = Excel.Workbook(File.Contents("O:\MS4 Program\MCM4 Construction Site Stormwater Runoff Control\SWPPP Tracker\SWPPP Inspection Processor.xlsm"), null, true),
    ApplicationNumber_Files_Folders_Table = Source{[Item="ApplicationNumber_Files_Folders",Kind="Table"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(ApplicationNumber_Files_Folders_Table,{{"Application Number", type text}, {"Planning Project", type text}, {"Hidden Folder Path", type text}, {"Folder Path", type text}})
in
    #"Changed Type"

然后,按照 excelguru.ca 的建议,我尝试在单独的查询中将其分解:

Query Name: Query1

let
    Source = ApplicationNumber_Files_Folders,
    Cols = Table.SelectColumns(Source, "Hidden Folder Path"),
    ColsList = Table.ToList(Cols),
    SWPPP = List.Transform(ColsList, (url) => url&"\SWPPP"),
    // This line below is the problematic one
    loadedFiles = List.Transform(SWPPP , (url) => Folder.Contents(url))


in
    loadedFiles

我访问过这些网站:

如果您要查找其中包含文件的 SWPP 目录,我可能会将基本级别查询更改为 "Folder.Files" 而不是 "Folder.Contents",因为这将 return 指定基本目录的每个子目录中的每个文件。

= Folder.Files("C:\folders")

如果这些 SWPP 目录仅存在于您的年份文件夹中,您真正需要做的就是将文件夹路径列过滤为以 "SWPP\"

结尾的任何内容
= Table.SelectRows(#"Filtered Rows", each Text.EndsWith([Folder Path], "SWPP\"))

如果您只想过滤年份目录,这取决于您要查找的目录的复杂程度和多样性。如果它们都只是您所描述的单个目录中的年份文件夹,您可以做一些简单的事情,例如检查文件路径该位置的文本以查看它是否为“20”(假设您的年份只能追溯到 2000 年) ...),这不是最模块化的检查,但可能足以满足您的需求。

= Table.SelectRows(Source, each (Text.Range([Folder Path], 11, 2) = "20"))

从那里您可以过滤到您需要的任何内容(删除文件夹路径以外的所有列并删除其中的重复项将为您提供包含文件的每个 SWPP 目录的列表)