我想与员工导入一个csv并创建数据的层次结构

时间:2019-03-02 00:46:28

标签: powershell

我正在尝试创建一个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文件?

2 个答案:

答案 0 :(得分:1)

正如@Kory Gill所提到的,您错过了一些限制,无法正确定义您的请求(它们也不会在您的示例中显示),例如:

  • IdManagerId列不必按顺序排列
    (或者是始终将层次结构中较高级别的经理列出在最前面?)
  • 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