Pet*_*s K 0 powershell powershell-4.0
有没有办法增加Where-Obeject比较.它在两个文件中都有1000条记录,但是当文件超过500k时,它的记录非常慢.
function progressBar ($i, $totalItems) {
Write-Progress -Activity "My Progress Bar" -Status "Doing stuff on $s" -PercentComplete ($i / $totalItems * 100)
}
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
$f1 = (Import-Csv 'A.txt' -Delimiter 'µ' -Header samname, id)
$f2 = (Import-Csv 'B.txt' -Delimiter 'µ' -Header samname, id)
$counter = 0
$totalItems = $f1.Count
$f1 | ForEach-Object {
$samname = $_.samname
if ($m = $f2 | Where-Object {$_.samname -eq $samname}) {
$_.id = $m.id
} else {
$_.id = $_.id
}
$counter += 1
#Start-Sleep -s 3
progressbar -i $counter -totalItems $totalItems
}
$f1 | Export-Csv 'D.txt' -NoType
Run Code Online (Sandbox Code Playgroud)
通过语句中的Where-Object子句ForEach-Object,您可以有效地创建嵌套循环,这意味着脚本正在进行2500亿次比较.
我通常做的是将其中一个数组转换为哈希表,其中键是您要比较的属性的值,然后将其用作"查找表"(如果您愿意).
与迭代整个数组相比,按密钥访问哈希表非常快,因此它比当前方法快得多:
$f1=(import-csv 'A.txt' -Delimiter 'µ' -header samname,id)
$f2=(import-csv 'B.txt' -Delimiter 'µ' -header samname,id)
$h2 = @{}
$f2 |ForEach-Object {
$h2[$_.samname] = $_
}
$f1 |Foreach-object{
$samname=$_.samname
if($h2.ContainsKey($samname)){
$_.id = $h2[$samname].id
}
$counter += 1
#Start-Sleep -s 3
progressbar -i $counter -totalItems $totalItems
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |