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

时间:2018-01-17 22:06:48

标签: excel powershell if-statement big-o

我的脚本在检查多个参数的同时在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++
    }

}

1 个答案:

答案 0 :(得分:0)

我可以看到一些让你放慢速度的事情。至少对comobject进行多次调用会降低你的速度。您可以进行RegEx匹配或使用-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-Clipboard cmdlet的较新版本的PowerShell,则可以抓取字符串,并快速生成一组对象以使用PowerShell中的数据,然后清除工作表并粘贴返回结果。我将在这里使用RegEx匹配而不是-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命令,我认为这不是一个很好的选择,但如果你想要一个例子,我可以很容易地写一个。