Я хотел бы импортировать CSV с сотрудниками и создать иерархию данных - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь создать скрипт 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 голосов
/ 02 марта 2019

Как уже упоминалось @Kory Gill, вы пропустили некоторые ограничения для правильного определения вашего запроса (и они также не отображаются в вашем примере), например:

  • The *Столбцы 1005 * и ManagerId не обязательно должны быть в порядке
    (или менеджер выше в иерархии всегда указан первым?)
  • Нет никакой связи между ManagerId и уровень иерархии
    (или менеджер выше в иерархии всегда ниже ManagerId?)
  • Глубина иерархии не определена (неограничена)
    (Полагаю, что после реорганизации число уровней менеджера всегда может возрасти)

Если предположить, что вышеуказанные ограничения применимы, вопрос становится более сложным, но и более сложным.Чтобы показать это, я установил для Id топ-менеджера John Doe значение 11 и соответственно отсортировал список, оставив исходную иерархию без изменений:

$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

По какому результату вы можете отсортировать свой список на уровне иерархии, например:

Add-ManagerLevel $Employees | Sort-Object Level | Format-Table
0 голосов
/ 02 марта 2019

Я согласен с комментарием Кори Джилл.Тем не менее, делая некоторые предположения.Вы имеете в виду что-то подобное?

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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...