具有约束条件的Powershell随机获取

时间:2019-04-19 19:38:29

标签: powershell

我当前正在使用Powershell的Get-Random函数从csv中随机提取一定数量的行。我需要创建一个约束,说如果拉出一个id,找到匹配它的其他id并拉出它们的值。

这是我目前拥有的:

$chosenOnes = Import-CSV C:\Temp\pk2.csv | sort{Get-Random} | Select -first 6

$i = 1

$count = $chosenOnes | Group-Object householdID


foreach ($row in $count)
{

    if ($row.count -gt 1)
    {

        $students = $row.Group.Student

        foreach ($student in $students)
        {

            $name = $student.tostring()

            #...do something

            $i = $i + 1
         }
    }
    else
    {

        $name = $row.Group.Student

        if($i -le 5)
        {
            #...do something
        }
        else
        {
            #...do something
        }
        $i = $i + 1
    }
}

示例数据集

ID,name
165,Ernest Hemingway
1204,Mark Twain
1578,Stephen King
1634,Charles Dickens
1726,George Orwell
7751,John Doe
7751,Tim Doe

在此示例中,有7行,但是我在代码中随机选择6行。需要发生的是,当ID=7751时,我必须在ID=7751处都返回两行。不能在代码中静态设置ID。

2 个答案:

答案 0 :(得分:2)

Get-Random-Count一起直接用于从集合中提取给定数量的随机元素。

$allRows = Import-CSV C:\Temp\pk2.csv

$chosenHouseholdIDs = ($allRows | Get-Random -Count 6).householdID

然后使用householdID数组包含运算符,通过其householdID列是否包含6个随机选择的行的-in值之一(PSv3 +语法)来过滤所有行:

$allRows | Where-Object householdID -in $chosenHouseholdIDs

可选阅读:性能注意事项:

$allRows | Get-Random -Count 6不仅在概念上更简单,而且比$allRows | Sort-Object { Get-Random } | Select-Object -First 6

使用Time-Command function比较两种方法的性能,使用带有10列的1000行测试文件在Windows PowerShell中的Windows 10 VM上产生以下示例计时-注意Sort-Object { Get-Random }的解决方案要慢15倍以上!!

Factor Secs (100-run avg.) Command                                                        TimeSpan
------ ------------------- -------                                                        --------
1.00   0.007               $allRows | Get-Random -Count 6                                 00:00:00.0072520
15.65  0.113               $allRows | Sort-Object { Get-Random } | Select-Object -First 6 00:00:00.1134909

类似地,通过遍历所有行以通过数组包含运算符-in查找匹配的ID的效果要好于遍历随机选择的ID并为每行搜索所有行。

答案 1 :(得分:1)

我尝试坚持您的开始,并提出了这个建议。

$Array = Import-CSV C:\test\StudtentTest.csv
$Array | Sort{Get-Random} | select -first 2 | %{
    $id = $_.id
    $Array | ?{$_.id -eq $id} | %{
        $_
    }
}

$Array将是您解析的CSV

我们输入并通过随机选择-前2个(在这种情况下)进行排序 将对象的ID保存到$ id中,然后在数组中搜索该ID,并显示匹配的每个ID

如果相同的ID匹配,您最终会得到类似的信息

ID   name           
--   ----           
7751 John Doe       
7751 Tim Doe        
1634 Charles Dickens