首页 > 解决方案 > 带有 CSV 文件的 Powershell 随机团队生成器

问题描述

我正在使用一个脚本,该脚本应该导入我的 csv 文件,并随机将 3 个人放入一个团队中,并组成与玩家数量一样多的团队。

我可以导入我的 csv 文件,但我对如何从这一点进行处理非常迷茫。

我知道这不是很多,但我需要帮助才能开始。

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

我的 CSV 看起来像这样: 在此处输入图像描述

标签: powershelldata-partitioning

解决方案


这是一种可能的解决方案:

假设您有一个这样的 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如果您需要每支球队中更多或更少的球员,请调整。

编辑: 根据@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

推荐阅读