加速Where-Object与CSV文件的比较

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)

Mat*_*sen 5

通过语句中的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)