我正在尝试使用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\
从root(O:\ Planning Projects),我只对“年”文件夹中的文件夹感兴趣(例如:2012,2013,2014 ...)。内部有超过600个子目录(接近700个),随着时间的推移它们将继续增长。我试图尽可能地自动化和面向未来。
我需要的是进入每个“年”文件夹,转到子文件夹,检查是否有“SWPPP”文件夹,然后检查其中是否有任何文件。
我接近完成它,但是有一部分我被卡住了。我变得臭名昭着:
Formula.Firewall:查询'Query1'(步骤'loadedFiles')引用其他 查询或步骤,因此它可能无法直接访问数据源。请 重建此数据组合。
在继续之前,我已经完成了我的研究并访问了几个网站:
https://www.excelguru.ca/blog/2015/03/11/power-query-errors-please-rebuild-this-data-combination/
Power Query - Please rebuild this data combination
这是我遵循的程序:
我尝试在不同的部分打破算法,正如excelguru.ca所建议的那样,但是没有做任何事情。
我的第二种方法:
我正在使用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中创建的自定义表的查询,它将目录与“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
我访问了这些网站:
答案 0 :(得分:2)
如果您正在寻找包含文件的SWPP目录,我可能只是将基本级别查询更改为" Folder.Files"而不是" Folder.Contents",因为这将返回指定基目录的每个子目录中的每个文件。
= 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目录的列表)