题目:
将替换区的数据,挨个按顺序替换源数据,多出的补全在下面,需保持原来的顺序。
解法:
let 待替换= Excel.CurrentWorkbook(){[Name="表2"]}[Content], 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], 加索引 = Table.AddIndexColumn(源, "索引", 0, 1), 分组 = Table.Group(加索引,"项目",{"a",each Table.ToColumns(_)}), 合并 = Table.NestedJoin(分组,"项目",待替换,"项目","b",1), 自定义 = Table.AddColumn(合并, "自定义", each Table.FillDown(Table.FromColumns({[a]{0},[b][数据]&List.Skip([a]{1},Table.RowCount([b])),[a]{2}},Table.ColumnNames(加索引)),{"项目","索引"})), 展开 = Table.ExpandTableColumn(自定义, "自定义", {"数据", "索引"}, {"数据", "索引"}), 排序 = Table.Sort(展开,{"索引", 0}), 还原 = Table.SelectColumns(排序,{"项目", "数据"}) in 还原
方法待优化,如有其他好的方法或思路欢迎留言。
这个解法不太满意 一直在想优化的 多的没插到最后破坏了源顺序
按转record的思路看能不能优化?
两个表分别添加索引列,以索引列和项目为依据全部外连接合并查询后,构建新数据列然后选择相应列就可以吧。
是分别分组后添加的索引列,避免重复值
用Combine应该可以.这种一般用于什么场景下?
大神,你的结果不能显示F那一行,原因还不太清楚。请帮忙优化一下我的代码,谢谢。
let
Source = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
b = Table.Combine(Table.Group(Excel.CurrentWorkbook(){[Name="表2"]}[Content],"项目",{"n", each Table.AddIndexColumn(_,"idx",1)})[n]),
a = Table.Combine(Table.Group(Table.AddIndexColumn(Table.TransformColumnTypes(Source,{{"项目", type text}, {"数据", Int64.Type}}),"Index",1),"项目",{"n",each Table.AddIndexColumn(_,"idx",1)})[n]),
r = Table.RemoveColumns(Table.Sort(Table.FromRecords(List.Transform(Table.ToRecords(a), each _& (try Table.SelectRows(b,(x)=>x[idx]=_[idx] and x[项目]=_[项目]){0} otherwise []))),"Index"),{"Index","idx"}),
c = Table.RemoveColumns(Table.SelectRows(Table.NestedJoin(b,{"项目","idx"},a,{"项目","idx"},"x",JoinKind.LeftOuter),each Table.RowCount(_[x])=0),{"idx","x"}),
f = r&c
in
f
let
表1 = Table.Sort(Table.ExpandTableColumn(Table.Group(Table.AddIndexColumn(Excel.CurrentWorkbook(){[Name="表1"]}[Content],"Index"),"项目",{"index",each Table.AddIndexColumn(_,"_idx",1)}),"index",{"数据","Index","_idx"}),"Index"),
表2 = Table.Sort(Table.ExpandTableColumn(Table.Group(Table.AddIndexColumn(Excel.CurrentWorkbook(){[Name="表2"]}[Content],"Index"),"项目",{"index",each Table.AddIndexColumn(_,"_idx",1)}),"index",{"数据","Index","_idx"}),"Index"),
替换表1的数据 = Table.RenameColumns(Table.SelectColumns(Table.AddColumn(表1,"新数据",(x)=>if Table.Contains(表2,[项目=x[项目],_idx=x[_idx]]) then Table.SelectRows(表2,each [项目]=x[项目] and [_idx]=x[_idx])[数据]{0} else x[数据]),{"项目","新数据"}),{"新数据","数据"}),
#"表2中有,表1中没有" = Table.SelectColumns(Table.SelectRows(表2,each Table.Contains(表1,[项目=[项目],_idx=[_idx]])=false),{"项目","数据"}),
结果 =替换表1的数据 & #"表2中有,表1中没有"
in
结果
关于这题的重点,我的理解是怎么对每一行的 [项目] 进行累计计数。先对表1和表2分别进行累计计数,然后再进行合并查询就OK了。
至于怎么算累计计数,除了分组,还可以用Table.ReplaceValue来做,相比用分组,它的好处是不用变数据结构。
以表1为例:
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
索引 = Table.AddIndexColumn(源, "索引", 1, 1),
索引替换为累计 = Table.ReplaceValue(索引,索引[项目],each [项目],(x,y,z)=>List.Count(List.PositionOf(List.FirstN(y,x),z,2))
,{"索引"})
in
索引替换为累计
历害!
老师这个方法有点问题像是还没做完。显示出来的数据,除了索引列有区别,其他的和原表一样并没有产生替换。