Генератор случайных команд Powershell с CSV-файлом - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю со сценарием, который должен импортировать мой CSV-файл, случайным образом собрать 3 человека в команду и собрать столько команд, сколько есть игроков.

Я могу импортировать свой CSV-файл, но я очень потерян, как обрабатывать с этого момента.

Я знаю, что это не так уж и много, но мне нужна помощь, чтобы начать.

$users = import-csv "C:\Users\Bruger\Dokumenter\Esport_liste.csv"
Write-Host $users

Мой CSV выглядит так: enter image description here

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вот одно из возможных решений:

Скажем, у вас есть CSV, как это:

Player
David
Mary
Thomas
Alice
Michael
Gordon
Gary
Hannah
Sally
Richard
Colin
Emma
Paige
John
Alex

Тогда вы можете получить несколько случайных команд из этого следующим образом:

$players = Import-Csv .\players.csv
$teamSize = 3
$maxTeams = [math]::Floor($players.Count/$teamSize)

$teams = @{}

$shuffled = $players | Get-Random -Count $players.Count

$shuffled |
    ForEach-Object { $i = 0 }{
        $teams["$($i % $maxTeams)"] += @($_.Player)
        $i++
    }

Это приводит к хеш-таблице, подобной этой:

Name Value                  
---- -----                  
0    {Alice, David, Mary}   
1    {Gordon, Colin, John}  
2    {Emma, Paige, Thomas}  
3    {Alex, Hannah, Richard}
4    {Sally, Michael, Gary} 

Настройте $teamSize, если вам нужно больше или меньше игроков в каждой команде.

EDIT: Обновление на основе комментариев @ mklement0. Вышесказанное не является точным в том смысле, что оно не всегда дает размеры команды, соответствующие исходным требованиям. Например, для списка из 22 игроков:

TeamSize   Teams
--------   -----
1          1 x22
2          2 x11
3          3 x6 / 4 x1
4          4 x3 / 5 x2
5          5 x2 / 6 x2
6          7 x2 / 8 x1
7          7 x2 / 8 x1
8          11 x2
9          11 x2

Это, однако, производит более равномерно сбалансированные команды, если $teamSize не слишком близко к половине общего количества. Например, при строгом размере команды 5 у вас будет 4 команды по 5 и 1 команда из 2, что может быть слишком большим несовпадением в зависимости от сценария, но это дает 2 команды по 5 и 2 из 6, что может быть «справедливее».

В любом случае, улучшения @ mklement0 обеспечивают более строгое соблюдение этого требования. Вот код для этого:

$players = Import-Csv .\players.csv
$teamSize = 3
$maxTeams = [math]::Ceiling($players.Count/$teamSize)

$teams = @{}

$shuffled = $players | Get-Random -Count $players.Count

$shuffled |
    ForEach-Object { $i = 0 }{
        $teams["$([Math]::Floor($i / $teamSize))"] += @($_.Player)
        $i++
    }

Для сравнения, вот команды, которые это производит:

TeamSize   Teams
--------   -----
1          1 x22
2          2 x11
3          3 x7 / 1 x1
4          5 x4 / 2 x1
5          5 x4 / 2 x1
6          6 x3 / 4 x1
7          7 x3 / 1 x1
8          8 x2 / 6 x1
9          9 x2 / 4 x1
0 голосов
/ 14 ноября 2018

Возможное решение будет:

$users = import-csv "C:\Users\Bruger\Dokumenter\Esport_liste.csv" -Header "User"

$i = 0
$team = 1
$users | Sort-Object { Get-Random } | foreach {

    if(($i % 3) -eq 0){ " "; "Team $($team)"; $team++ }
    $_.User
    $i++
}

Я не буду объяснять это дальше.Постарайтесь понять это и спросите в комментариях, нужна ли дополнительная помощь.

...