嵌套加载文件夹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这个数据组合。
在继续之前,我已经完成了我的研究并访问了几个站点:
https://community.powerbi.com/t5/Desktop/Formula-Firewall-Query-references-other-queries-so-it-may-not/td-p/18619
电力查询 – 请重build这个数据组合
这是我遵循的程序:
- 我加载根目录。 (O:\规划项目)
- 做一些逻辑将“年”文件夹放入列表中:{2012,2013,2014等}
- 从列表中,我迭代并获取每个列表中的目录。 (到现在为止还挺好)
- 现在,我尝试追加“SWPPP”文件夹结构,并尝试从文件夹中获取内容。 那么这就是我遇到错误的地方。
我试图按照excelguru.ca的build议在不同的部分打破这个algorithm,但是这并没有做任何事情。
我的第二个方法:
- 从前面的步骤重复步骤1 – 3。
- 将目录加载到Excel中(请参阅步骤3),然后在创build的自定义表格中连接“SWPPP”。
- 使用Power Query从Excel文件导入(通过导入相同的文件)将自定义表加载到新的查询中。
- 我试着再次阅读文件,但它给了我同样的错误。
我正在使用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目录有文件)