实例需求:如下是AD用户的列表,每个用户拥有该应用程序的只读或读写权限,现在需要创建新的AD用户组,并根据用户当前的权限,将这些用户添加到相应的组中。
当前数据集:
Safe | UserName | Read permissions | RW permissions |
---|---|---|---|
Safe1 | User1 | Yes | Yes |
Safe1 | User2 | Yes | No |
Safe1 | User3 | Yes | Yes |
Safe1 | User4 | Yes | No |
Safe2 | User1 | Yes | Yes |
Safe2 | User2 | Yes | No |
Safe2 | User3 | Yes | Yes |
Safe2 | User4 | Yes | No |
整理后输出数据集:
Safe | AD | Group Userlist |
---|---|---|
Safe1 | Safe1-ReadGroup | User1,User2,User3,User4 |
Safe1 | Safe1-RWGroup | User1,User3 |
Safe2 | Safe2-ReadGroup | User1,User2,User3,User4 |
Safe2 | Safe2-RWGroup | User1,User3 |
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
AddedRG = Table.AddColumn(Source, "ReadGroup", each if [Read permissions] = "Yes" then [UserName] else null),
AddedRWG = Table.AddColumn(AddedRG, "RWGroup", each if [RW permissions] = "Yes" then [UserName] else null),
RemovedColumns = Table.RemoveColumns(AddedRWG,{"UserName", "Read permissions", "RW permissions"}),
GroupedRG = Table.Group(RemovedColumns, {"Safe"}, {{"UserList", each Text.Combine([ReadGroup], ","), type text}}),
GroupedRGCol = Table.AddColumn(GroupedRG, "AD Group", each [Safe] & "-ReadGroup"),
GroupedRWG = Table.Group(RemovedColumns, {"Safe"}, {{"UserList", each Text.Combine([RWGroup], ","), type text}}),
GroupedRWGCol = Table.AddColumn(GroupedRWG, "AD Group", each [Safe] & "-RWGroup"),
AppendedTable = Table.Combine({GroupedRGCol, GroupedRWGCol}),
Output = Table.ReorderColumns(AppendedTable,{"Safe", "AD Group", "UserList"})
in
Output
【代码解析】
第2行代码加载Excel表Table1作为源数据。
第3行代码基于读取权限添加新列ReadGroup,用户名赋值,否则为空。
第4行代码基于写权限添加新列RWGroup,用户名赋值,否则为空。
第5行代码删除不需要的原始数据列。
第6行代码基于Safe列分组,生成读取权限用户列表。
第7行代码添加新列作为读取权限用户组名称。
第8行代码基于Safe列分组,生成写权限用户列表。
第9行代码添加新列作为写权限用户组名称。
第10行代码合并读取权限和写权限两个表。
第11行代码重新排列列顺序。
第13行代码输出最后的结果表。
小结:
可以利用Power Query的表处理能力,同样实现按权限分组的转换需求,使用Group和Combine可以方便地进行分组和合并。