Загружать определенные файлы в папке на разные листы в книге - PullRequest
0 голосов
/ 11 октября 2018

Я пытался преобразовать макрос-код 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) Query GetFiles

AllFiles = Folder.Files(FolderPath)

2) Query FilterFiles

AllFiles = GetFiles,
FilterFiles = Table.SelectRows(AllFiles, each ([Extension] = ".dat"))

3) Query BuildFilePath

FilteredFiles = FilterFiles,
BuildFilePath = Table.AddColumn(FilteredFiles, "FilePath", each [Folder Path] & [Name])

4) Query FileExists

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)') ссылается на другие запросы или шаги, поэтому может не иметь прямого доступа к источнику данных.Пожалуйста, перестройте эту комбинацию данных.

Также я просто хочу загрузить файлы, а не промежуточные таблицы

Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Тогда, может быть, вы захотите попробовать функцию.Что-то вроде этой функции, которую я назвал 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
0 голосов
/ 15 октября 2018

Возможно this ...

Начните с той части вашего запроса, которая извлекает информацию о папке как собственный запрос.(Если вы установите его для загрузки только в качестве соединения, он не создаст электронную таблицу.) Я назвал его 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
0 голосов
/ 11 октября 2018

Каждый запрос загружает отдельный лист, поэтому вам нужно три запроса:

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 таблицы ... один дляфайл каждой вкладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...