Nest加载文件夹路径Power Query

时间:2017-10-27 19:59:38

标签: excel powerquery m

我正在尝试使用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/

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”附加到文件夹结构,并尝试从文件夹中获取内容。那就是我被击中的地方 错误。
  4. 我尝试在不同的部分打破算法,正如excelguru.ca所建议的那样,但是没有做任何事情。

    我的第二种方法:

    1. 重复上一步骤中的步骤1-3。
    2. 将目录加载到Excel中(参见步骤3),然后连接  我创建的自定义表中的“SWPPP”。
    3. 使用Power Query的导入将自定义表加载到新查询中  Excel文件(通过导入相同的文件)。
    4. 我尝试再次阅读这些文件,但它给了我同样的错误。
    5. 我正在使用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
      

      我访问了这些网站:

1 个答案:

答案 0 :(得分:2)

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

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

Base Query

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

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

enter image description here

如果您只想过滤年份目录,则取决于您要查找的目录的复杂程度。如果它们只是你所描述的单个目录中的年份文件夹,你可以做一些简单的事情,比如检查文件路径的那个位置的文本,看它是不是" 20" (假设你的年份只能回到2000年......),这不是最模块化的检查,但可能足以满足你的需求。

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

enter image description here

从那里你可以过滤到你需要的任何东西(删除除文件夹路径之外的所有列并删除它上面的重复项将为你提供每个包含文件的SWPP目录的列表)