我当前正在使用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。
答案 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