我正在尝试创建一个Powershell脚本,该脚本将导入具有以下格式雇员的csv。
ID,FirstName, LastName, Managers ID
1, John, Doe, 0 (is the top of hierarchy)
2, Jane, Doe, 1
45, Josh, Davis, 1
33, Steve, Clark, 2
我的问题是,由于员工在csv中,因此他们不在层次结构中。有没有办法组织这些人并将其导出到另一个csv文件?
答案 0 :(得分:1)
正如@Kory Gill所提到的,您错过了一些限制,无法正确定义您的请求(它们也不会在您的示例中显示),例如:
Id
和ManagerId
列不必按顺序排列 ManagerId
与层次结构级别之间没有关系 ManagerId
?)假设上述约束适用,则问题变得更加复杂,同时也更具挑战性。为了说明这一点,我将最高管理者Id
的{{1}}设置为John Doe
并相应地对列表进行了排序,使原始层次结构保持不变:
11
满足此要求时,您可能需要创建一个recursive函数来确定经理(经理……等)的经理。下面是一个示例,说明如何解决这个问题:
$Employees = ConvertFrom-Csv 'ID, FirstName, LastName, ManagerId
2, Jane, Doe, 11
11, John, Doe, 0
45, Josh, Davis, 11
33, Steve, Clark, 2'
请注意,Function Add-ManagerLevel([Object[]]$Employees) {
Function Get-Level($ManagerId, [Int]$Level = 0) { # 0 is the top of hierarchy
$Manager = $Employees | Where-Object {$_.Id -eq $ManagerId}
If (!$Manager) {$Level} Else {Get-Level $Manager.ManagerId ($Level + 1)}
}
$Employees | ForEach-Object {
$_ | Add-Member "Level" (Get-Level $_.ManagerId) -PassThru
}
}
帮助函数会自行调用,以查找经理是否具有更高的经理。
这将给出以下输出:
Get-Level
您可以在层次结构级别上对列表进行排序,例如:
Add-ManagerLevel $Employees | Format-Table
ID FirstName LastName ManagerId Level
-- --------- -------- --------- -----
2 Jane Doe 11 1
11 John Doe 0 0
45 Josh Davis 11 1
33 Steve Clark 2 2
答案 1 :(得分:0)
我同意Kory Gill的评论。 但是,做一些假设。你的意思是这样吗?
Clear-Host
(Import-Csv -Path 'E:\Temp\Employees.csv' |
Select-Object -Property 'Managers ID', ID, FirstName, LastName |
Group-Object -Property 'Managers ID' |
Sort-Object -Property 'Managers ID',ID) |
ForEach{
"Processing GroupManagersID $($PSItem.Name)`t" + ('*')*20
ForEach ($Staff in $PSItem)
{
$Staff.Group |
Select-Object -Property ID, FirstName, LastName
}
"`n"
}
# Results
Processing GroupManagersID 0 ********************
ID FirstName LastName
-- --------- --------
1 John Doe
Processing GroupManagersID 1 ********************
2 Jane Doe
45 Josh Davis
Processing GroupManagersID 2 ********************
33 Steve Clark