嵌套加载文件夹pathPower 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),我只对“年份”文件夹内的文件夹感兴趣(例如:2012,2013,2014 …)。 里面有600多个子目录(接近700个),随着时间的推移它们会不断增长。 我试图尽可能地自动化和面向未来。

我需要的是每个“年份”文件夹,去到子文件夹,检查是否有一个“SWPPP”文件夹,然后检查是否有任何文件。

我已经接近完成了,但是有一部分我被困住了。 我得到臭名昭着的:

Formula.Firewall:查询'Query1'(步骤'loadedFiles')引用其他查询或步骤,因此它可能不直接访问数据源。 请重build这个数据组合。

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

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

电力查询 – 请重build这个数据组合

这是我遵循的程序:

  1. 我加载根目录。 (O:\规划项目)
  2. 做一些逻辑将“年”文件夹放入列表中:{2012,2013,2014等}
  3. 从列表中,我迭代并获取每个列表中的目录。 (到现在为止还挺好)
    1. 现在,我尝试追加“SWPPP”文件夹结构,并尝试从文件夹中获取内容。 那么这就是我遇到错误的地方。

我试图按照excelguru.ca的build议在不同的部分打破这个algorithm,但是这并没有做任何事情。

我的第二个方法:

  1. 从前面的步骤重复步骤1 – 3。
  2. 将目录加载到Excel中(请参阅步骤3),然后在创build的自定义表格中连接“SWPPP”。
  3. 使用Power Query从Excel文件导入(通过导入相同的文件)将自定义表加载到新的查询中。
  4. 我试着再次阅读文件,但它给了我同样的错误。

我正在使用m编程语言把所有的东西放在一起(需要一些帮助,只知道一天),我被困住了。

这是第二种方法:

这第一个查询加载“年”文件夹中的所有子目录。

 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中创build的自定义表格的查询,它将目录与“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的build议,我试着在一个单独的查询中分解它:

 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”,因为这将返回指定的每个子目录中的每个文件基本目录。

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

基本查询

如果这些SWPP目录只存在于您的年份文件夹中,则您只需将文件夹path列过滤为任何以“SWPP \”结尾的内容

 = Table.SelectRows(#"Filtered Rows", each Text.EndsWith([Folder Path], "SWPP\")) 

在这里输入图像说明

如果您只想过滤年份目录,则取决于您要查找的目录的复杂程度和多样性。 如果他们都只是一个单一的目录中的文件夹,你可以做一些简单的事情,比如检查文件path的那个位置的文本,看它是否是“20”(假设你的年限只能回到2000年) …),这不是最模块化的检查,但可能足以满足您的需求。

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

在这里输入图像说明

从那里你可以过滤到你需要的任何东西(删除除文件夹path以外的所有列,删除它上面的重复将给你一个列表中的每个SWPP目录有文件)