【问题标题】:Powershell random team generator with CSV file带有 CSV 文件的 Powershell 随机团队生成器
【发布时间】:2018-11-14 10:02:22
【问题描述】:

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

我可以导入我的 csv 文件,但我不知道如何处理。

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

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

我的 CSV 如下所示:

【问题讨论】:

  • 你的 csv 看起来怎么样?
  • @TobyU 请看我的编辑。
  • 几件事: 1. 不要在导入时使用Write-Host。该函数将导入的 csv 转换为字符串,这不是您想要的。 2. 看看for-loops:ss64.com/ps/for.html 3. 对于随机部分,看看Get-Random 4. 你的 csv 更像是一个文本文件而不是真正的 csv。如果您使用的是没有标题的 .csv 文件,请深入了解 import-csv 的工作原理。
  • @JamesC。当然相关,但链接的问题仅涵盖此处所问问题的部分:此处添加的元素是希望使用随机选择输入元素创建固定大小的块。

标签: powershell data-partitioning


【解决方案1】:

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

说,你有一个这样的 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 的 cmets 进行更新。上述内容并不准确,因为它并不总是提供与原始要求相匹配的团队规模。例如,对于 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

【讨论】:

    【解决方案2】:

    一个可能的解决方案是:

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

    我不会进一步解释。如果需要进一步的帮助,请尝试理解并在 cmets 中询问。

    【讨论】:

    • 感谢就像一个魅力!如果我想添加诸如 Team 1、Team 2、Team 3 之类的内容。如何将其合并到代码中?
    • 我已经添加了团队名称。
    • 这是一个好的开始,并且提供了一个很好的显示团队将是什么,但它不会为团队创建 数据结构团队。 ... | Sort-Object { Get-Random } 是洗牌未知大小集合的一种优雅方式,但如果预先知道集合大小,... | Get-Random -Count 会快得多。但是,对于小的输入数组,这无关紧要。
    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2022-08-15
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多