我试图将VBA宏代码转换为功率查询,但现在看起来像卡住了。 我有一个文件夹,最多可以包含4个文件。 3个具有.dat扩展名,1个具有.txt扩展名。我想要实现的是将所有扩展名为.dat的文件加载到不同的工作表中。我尝试了两种方法。
方法之一-单个查询中的所有内容
1)获取文件夹中的所有文件
GetFiles = Folder.Files("FolderPath"),
2)过滤扩展名为.dat的文件
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
3)添加一个包含filePath和fileName的列
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
4)检查3个文件中的哪个可用
Tab1 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab1")),
Tab2 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab2")),
Tab3 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab3")),
HasTab1 = Table.RowCount(Tab1),
Tab1Content = if HasTab1 > 0 then Csv.Document(File.Contents(Tab1[FilePath]{0}), null, "~") else "",
HasTab2 = Table.RowCount(Tab2),
Tab2Content = if HasTab2 > 0 then Csv.Document(File.Contents(Tab2[FilePath]{0}), null, "~") else "",
HasTab3 = Table.RowCount(Tab3),
Tab3Content = if HasTab3 > 0 then Csv.Document(File.Contents(Tab3[FilePath]{0}), null, "~") else "",
对于这种方法,我在查询步骤中加载了文件内容,但是我仍然不知道如何将它们输出到不同的工作表中。
采用两种方法-模块化的,用于处理不同事情的单独文件
1)查询GetFiles
AllFiles = Folder.Files(FolderPath)
2)查询过滤文件
AllFiles = GetFiles,
FilterFiles = Table.SelectRows(AllFiles, each ([Extension] = ".dat"))
3)查询BuildFilePath
FilteredFiles = FilterFiles,
BuildFilePath = Table.AddColumn(FilteredFiles, "FilePath", each [Folder Path] & [Name])
4)查询文件是否存在
FileExists = (TabName, FileTable) =>
let
TabRow = Table.SelectRows(FileTable, each Text.Contains([Name], TabName)),
RowCount = Table.RowCount(TabRow),
HasFile = if RowCount > 0 then TabRow[FilePath]{0} else "false"
in
HasFile
5)查询LoadTab1
Source = BuildFilePath,
FilePath = FileExists("Tab1", BuildFilePath),
LoadFile = if FilePath <> "false" then Csv.Document(File.Contents(FilePath), null, "~") else ""
在这一步中我遇到了错误
Formula.Firewall:查询“ LoadTab1”(步骤“ LoadFile”)引用 其他查询或步骤,因此它可能不会直接访问数据源。 请重建此数据组合。
我也只想加载文件而不是中间表
任何帮助将不胜感激。
答案 0 :(得分:0)
每个查询都加载一个单独的工作表,因此您需要三个查询:
let
Source = "",
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
Tab1 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab1")),
HasTab1 = Table.RowCount(Tab1),
Tab1Content = if HasTab1 > 0 then Csv.Document(File.Contents(Tab1[FilePath]{0}), null, "~") else ""
in
Tab1Content
let
Source = "",
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
Tab2 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab2")),
HasTab2 = Table.RowCount(Tab2),
Tab2Content = if HasTab2 > 0 then Csv.Document(File.Contents(Tab2[FilePath]{0}), null, "~") else ""
in
Tab2Content
let
Source = "",
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
Tab3 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab3")),
HasTab3 = Table.RowCount(Tab3),
Tab3Content = if HasTab3 > 0 then Csv.Document(File.Contents(Tab3[FilePath]{0}), null, "~") else ""
in
Tab3Content
关闭并加载查询编辑器时,它将创建3个电子表格...每个标签文件一个。
答案 1 :(得分:0)
然后,您可能想尝试一个功能。类似于此函数,我将其命名为 GetTab :
let
Source = (TabName) =>
let
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
Tab = Table.SelectRows(BuildFilePath , each Text.Contains([Name], TabName)),
HasTab = Table.RowCount(Tab),
TabContent = if HasTab > 0 then Csv.Document(File.Contents(Tab[FilePath]{0}), null, "~") else ""
in
TabContent
in
Source
然后我从另外三个单独的查询中调用:
let
TabName = Function.Invoke(GetTab,{"Tab1"})
in
TabName
let
TabName = Function.Invoke(GetTab,{"Tab2"})
in
TabName
let
TabName = Function.Invoke(GetTab,{"Tab3"})
in
TabName
答案 2 :(得分:0)
也许这个...
从查询的一部分开始,该部分将文件夹信息作为自己的查询。 (如果将其设置为仅加载为连接,则不会创建电子表格。)我将其命名为 GetFolderInfo :
let
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name])
in
BuildFilePath
(用上面的实际文件夹路径替换上面查询中的“ FolderPath” ,以\结束,并用引号引起来。例如:“ C:\ mypath \”。)
然后创建一个引用GetFolderInfo查询的函数。就像我先前的答案一样,我称这个为 GetTab :
let
Source = (TabName) =>
let
Tab = Table.SelectRows(GetFolderInfo, each Text.Contains([Name], TabName)),
HasTab = Table.RowCount(Tab),
TabContent = Tab{[#"Folder Path"="FolderPath",Name=TabName&".dat"]}[Content],
ToCSV = if HasTab > 0 then Csv.Document(TabContent) else ""
in
ToCSV
in
Source
(在上面的函数中,将“ FolderPath” 替换为您的实际文件夹路径,以\结尾,并用引号引起来。例如:“ C:\ mypath \”。请勿更改# “文件夹路径” 。)
然后从三个单独的查询中调用GetTab函数,就像我之前的答案一样。
let
TabName = Function.Invoke(GetTab,{"Tab1"})
in
TabName
let
TabName = Function.Invoke(GetTab,{"Tab2"})
in
TabName
let
TabName = Function.Invoke(GetTab,{"Tab3"})
in
TabName