带有CSV文件的Powershell随机团队生成器

带有CSV文件的Powershell随机团队生成器,powershell,data-partitioning,Powershell,Data Partitioning,我正在使用一个脚本,该脚本应该导入我的csv文件,并在一个团队中随机放置3个人,并创建尽可能多的团队 我可以导入我的csv文件,但是我对如何从这一点开始处理感到非常困惑 我知道不多,但我需要帮助才能开始 $users = import-csv "C:\Users\Bruger\Dokumenter\Esport_liste.csv" Write-Host $users 我的CSV看起来像这样: 一个可能的解决方案是: $users = import-csv "C:\Users\Bruger\D

我正在使用一个脚本,该脚本应该导入我的csv文件,并在一个团队中随机放置3个人,并创建尽可能多的团队

我可以导入我的csv文件,但是我对如何从这一点开始处理感到非常困惑

我知道不多,但我需要帮助才能开始

$users = import-csv "C:\Users\Bruger\Dokumenter\Esport_liste.csv"
Write-Host $users
我的CSV看起来像这样:
一个可能的解决方案是:

$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++
}

我不会再进一步解释了。如果需要进一步的帮助,试着理解它并在评论中询问。

这里有一个可能的解决方案:

比如说,您有这样一个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

你的csv看起来怎么样?@TobyU请看我的编辑。一些事情:1。导入时不要使用
Write Host
。函数将导入的csv转换为字符串,这不是您想要的。2.查看
中的
-循环:3。对于随机部分,请查看
Get random
4。csv更像一个文本文件,而不是一个真正的csv。如果您使用的是没有标题的.csv文件,请深入了解
import csv
的工作原理。可能与@JamesC重复。当然是相关的,但链接的问题只涵盖了这里被问到的部分内容:这里添加的元素是希望用随机选择的输入元素创建固定大小的块。谢谢工作得很有魅力!如果我想添加像团队1、团队2、团队3之类的内容。如何将其合并到代码中?我已经添加了团队名称。这是一个很好的开始,可以很好地显示团队将是什么样的,但它不会为团队创建数据结构<代码>…|排序对象{Get Random}
是一种对未知大小的集合进行洗牌的优雅方法,但是如果集合大小事先已知,
…|获取随机计数
要快得多。不过,使用小的输入阵列并不重要。