我正在 Power Query for Power BI 中组合多个数据文件。我的每个文件都有一百多个列,其中一些名称相同,而大多数名称不同。这是一个截断的示例。
文件A
身份证 | 描述 | 替代 | 标准偏差 | 项目1 | 项目2 |
---|---|---|---|---|---|
1 | 福 | f | .2 | 12344 | 144 |
2 | 酒吧 | b1 | .3 | 12355 | 155 |
3 | 巴兹 | b2 | .255 | 12366 | 166 |
文件B
身份证 | 描述 | 标准偏差 | IDplus | 项目10 | 项目11 |
---|---|---|---|---|---|
1 | 福 | .5 | 事情1 | 944 | 9944 |
2 | 酒吧 | .8 | 东西2 | 955 | 9955 |
3 | 巴兹 | .111 | 事情3 | 966 | 9966 |
合并后我现在拥有的:
身份证 | 描述 | 替代 | 标准偏差 | 项目1 | 项目2 | IDplus | 项目10 | 项目11 |
---|---|---|---|---|---|---|---|---|
1 | 福 | f | .2 | 12344 | 144 | 空 | 空 | 空 |
2 | 酒吧 | b1 | .3 | 12355 | 155 | 空 | 空 | 空 |
3 | 巴兹 | b2 | .255 | 12366 | 166 | 空 | 空 | 空 |
1 | 福 | 空 | .5 | 空 | 空 | 事情1 | 944 | 9944 |
2 | 酒吧 | 空 | .8 | 空 | 空 | 东西2 | 955 | 9955 |
3 | 巴兹 | 空 | .111 | 空 | 空 | 事情3 | 966 | 9966 |
我希望的结果:
身份证 | 描述 | 替代 | 项目1 | 项目2 | IDplus | 项目10 | 项目11 | 标准偏差A | 标准偏差B |
---|---|---|---|---|---|---|---|---|---|
1 | 福 | f | 12344 | 144 | 事情1 | 944 | 9944 | .2 | .5 |
2 | 酒吧 | b1 | 12355 | 155 | 东西2 | 955 | 9955 | .3 | .8 |
3 | 巴兹 | b2 | 12366 | 166 | 事情3 | 966 | 9966 | .255 | .111 |
所以我本质上想做的是将它们折叠(该词的非技术用途)为更少的行。由于无论如何所有列都在那里,因此复制大量数据似乎是浪费空间,因为我有几百列和数千行。
我知道我当前的结果和我希望的结果在语义上是相同的,但感觉所需的结果会占用较少的内存。
问题:
提前致谢!
我在 Power BI 中使用了 Power Query。我进行了文件夹导入和多次转换,包括自定义列代码。
如果您发布的内容代表文件内容,则无需旋转。这只是进行顺序连接的问题。
这里是示例代码,假设您的文件是制表符分隔的文本文件。
如果文件是其他文件,您将需要更改正在使用的文件处理例程,但这应该可以帮助您开始:
let
//Get the folder files
Source = Folder.Files("C:\Users\ron\Desktop\myCSVfiles"),
//filter to select only the relevant files
// change this to something that works
#"Binaries" = Table.SelectRows(Source, each ([Extension] = ".txt"))[Content],
//Assuming there is a column of binaries, and that these represent tab-separated text files,you can use the following
//If the tables are something else, you will need to replace the
// `Table.PromoteHeaders(Csv.Document(Text.FromBinary(#"Binaries"{0}),null,"#(tab)")),` lines with something appropriate
#"Combine Binaries" = List.Accumulate(
List.Skip(#"Binaries"),
Table.PromoteHeaders(Csv.Document(Text.FromBinary(#"Binaries"{0}),null,"#(tab)")),
(s,c)=> let
nextTable = Csv.Document(Text.FromBinary(c),null,"#(tab)"),
#"Promote Headers" = Table.PromoteHeaders(nextTable),
Join = Table.NestedJoin(s,"ID",#"Promote Headers","ID","Joined",JoinKind.FullOuter),
#"s Columns" = Table.ColumnNames(s),
#"Next Table Columns" = Table.ColumnNames(Join[Joined]{0}),
#"Expand Table" = Table.ExpandTableColumn(Join,"Joined", List.RemoveMatchingItems(#"Next Table Columns",#"s Columns"))
in #"Expand Table")
in
#"Combine Binaries"