使用多个参数减少计算时间



我的脚本在检查多个参数时以 O(n) 时间运行;如果可能的话,我正在寻找一种接近 O(1) 时间的方法。 请忽略我正在使用 excel 的事实;脚本的其他部分正在使用这些方法。 所有建议都值得赞赏。

$rowMax = ($sheet.UsedRange.Rows).count  
$count = 0
$countDelete = 0
#Declare the starting positions
$rowCompName,$colCompName = 1,3
#Checking Loop
for ($i=1; $i -le $rowMax-1; $i++){                   
$CompName = $sheet.Cells.Item($rowCompName+$i,$colCompName).text.ToUpper()
#Items Processed
$count++
#Removal of non-ND machines
if($CompName -eq ''){
continue
}
$CompName = $CompName.Substring(0,5)    
if($CompName -ne "Name1" -and $CompName -ne "Name2" -and $CompName -ne "Name3" -and $CompName -ne "Name4") {
$returnsTrue = $sheet.Cells.Item($rowCompName+$i,$colCompName).EntireRow.Delete()
$rowsDeleted++ 
$i--   
$rowMax--
$countDelete++
}
}

我可以看到一些让你放慢速度的事情。至少对 comobject 进行多次调用会减慢您的速度。您可以进行正则表达式匹配或使用-in运算符,只需检查名称是否在名称列表中即可。还可以选择使用Switch命令并制作案例,但我不确定这会为您加快多少速度。只需快速浏览一下就会告诉我尝试一下:

$InitialRows = $Sheet.UsedRange.Rows.Count
$Excludes = 'NAME1','NAME2','NAME3','NAME4',$null
$Sheet.UsedRange.Rows | Where{$_.Cells.Item(3).Value2.ToUpper().Substring(0,5) -notin $Excludes} | ForEach{$_.EntireRow.Delete() | Out-Null}
$RowsDeleted = $InitialRows - $Sheet.UsedRange.Rows.Count

这将保留第三个单元格中没有任何内容或与您指定的 4 个名称匹配的任何行。

如果你使用的是具有Get-Clipboardcmdlet 的较新版本的 PowerShell,则可以获取字符串,并相当快速地创建对象数组以处理 PowerShell 中的数据,然后清除工作表并将结果粘贴回去。我将在此处使用正则表达式匹配项而不是-in运算符。

$Excludes = 'NAME1','NAME2','NAME3','NAME4'
$RegEx = ($Excludes | %{[regex]::escape($_)}) -join '|'
$sheet.UsedRange.Copy() | Out-Null
$dataImport = Get-Clipboard | ConvertFrom-Csv -Delimiter "`t"
$Sheet.UsedRange.Clear() | Out-Null
$dataImport.Where({[string]::IsNullOrEmpty($_.ServerName) -or $_.ServerName.Substring(0,5) -match "^$RegEx"}) | ConvertTo-Csv -Del "`t" -NoType | Clip
$Sheet.Cells.Item(1).PasteSpecial() | Out-Null

这应该与第一个执行相同的操作,尽管我没有执行任何操作来计算行数,但是由于所有数据仍在PowerShell中,因此您可以对其进行行计数或对其进行任何处理。至于Switch命令,我认为这不是一个不错的选择,但如果你想要一个例子,我可以很容易地写一个。

最新更新