PowerQuery - 并排导入文件

Posted

技术标签:

【中文标题】PowerQuery - 并排导入文件【英文标题】:PowerQuery - Import files side by side 【发布时间】:2019-11-27 15:12:19 【问题描述】:

我收到一份关于磁盘 I/O 的报告,由于某种原因,该报告一次只提供 100 个 lun 的信息...由于报告接近 300 个 lun,我每天都会获得相同的免费文件报告。至少每天的磁盘顺序保持不变。

所以,我得到了一些包含以下内容的文件:

 - 01.11.2019_01.csv
 - 01.11.2019_02.csv
 - 01.11.2019_03.csv
 - 02.11.2019_01.csv
 - 02.11.2019_02.csv
 - 02.11.2019_03.csv 

每个文件的内容是:

Timestamp, disk1, disk2, disk3, ..., disk100
Timestamp1, IOPS, IOPS, IOPS, ..., IOPS

每个以 01 结尾的文件对于每个数据都有相同的 100 个 lun,同样适用于 02 和 03。磁盘顺序甚至相同(它已经有所帮助)。

我可以通过 powerquery 将文件导入到 excel 中,但这会按顺序添加它们。对我不好,因为我需要保持磁盘的顺序。

我在 PowerQuery 中添加了一个条件列来过滤所有以 1、2 和 3 结尾的文件。不幸的是,PowerQuery 不允许我,或者至少我还没有找到一种方法,将过滤器用于所有列为 1 的文件使用相同的列,所有以 2 开头的列都从 1 的列末尾开始,到 3 的方法相同。

所以,归根结底,我希望实现这一点:(文件被实际值替换)

- 01.11.2019_01.csv 01.11.2019_02.csv 01.11.2019_03.csv
- 02.11.2019_01.csv 02.11.2019_02.csv 02.11.2019_03.csv 

我尝试在数据导入中使用转置列,但这会转置所有日期。 在条件列的帮助下,我可以过滤和转置所有以 01 结尾的内容,但我不能对 02 做同样的事情,因为它已经消失了。

目前我唯一的方法是拥有 3 个不同的源连接,每个 01、02、03 一个,然后仍然使用单独的查询将它们全部放在一张表中。

关于如何在不经历之前的独立连接场景的情况下实现这一点的任何想法?

提前致谢

【问题讨论】:

【参考方案1】:

看看这是否适合你

将所有 .csv 文件放在一个目录中(此处为 c:\directory\subdirectory)

在下面运行注释代码

它将读取所有的 csv 文件,在每个表上附加文件名,然后合并表/文件

使用带有文件名的额外列来执行您需要对其执行的任何操作,例如通过使用带有 = Text.Start(Text.End([Name], 5),1)) 为公式

//read all files in specified directory
     let Source = Folder.Files("C:\directory\subdirectory"),
//filter only .csv
     #"Filtered Rows" = Table.SelectRows(Source, each ([Extension] = ".csv")),
//Pull contents of each file into table with first row promoted as header
     #"Added Custom" = Table.AddColumn(#"Filtered Rows", "Custom", each Table.PromoteHeaders(Csv.Document(File.Contents([Folder Path]&"\"&[Name]),[Delimiter=",", Encoding=1252, QuoteStyle=QuoteStyle.None]),[PromoteAllScalars=true])),
//dymnamic determination of number of columns in imported data so we can expand column
     ColumnContents = Table.Column(#"Added Custom", "Custom"),
     ColumnsToExpand = List.Distinct(List.Combine(List.Transform(ColumnContents, each if _ is table then Table.ColumnNames(_) else ))),
// expand column
     Expand =  Table.ExpandTableColumn(#"Added Custom",  "Custom",   ColumnsToExpand, ColumnsToExpand),
// remove extra columns
     #"Removed Columns" = Table.RemoveColumns(Expand,"Content", "Extension", "Date accessed", "Date modified", "Date created", "Attributes", "Folder Path")
     in #"Removed Columns"

【讨论】:

【参考方案2】:

假设,您有以下数据:

据我了解,您希望达到这个结果(在我看来,它看起来并不方便,但由于表的结构相同,可能会有各种情况):

那么你可以使用这样的代码:

let
    split = Table.SplitColumn(Source, "File", Splitter.SplitTextByDelimiter("_"), "date", "id"),
    transform = Table.TransformColumns(split, "id", each Text.BeforeDelimiter(_, ".csv")),
    pivot = Table.Pivot(transform, List.Distinct(transform[id]), "id", "Data")
in
    pivot

【讨论】:

以上是关于PowerQuery - 并排导入文件的主要内容,如果未能解决你的问题,请参考以下文章

PowerQueryPowerBI 的PowerQuery支持的数据集成

PowerQueryExcel的PowerQuery 数据导入界面

PowerQuery系列文章-PowerBI SQL 导入数据与增量刷新

将 Power Query .odc 文件导入其他工作簿

Excel PowerQuery:数字列中的空值

powerquery导入sharepoint list后如何展开