提高PowerShell功能从CSV中删除重复项的性能

时间:2019-06-27 19:40:05

标签: performance function powershell csv large-data

我需要利用PowerShell解决CSV中包含大量数据集的问题。我需要将CSV读取到内存中,并执行从CSV中删除所有重复项的操作。

除了使用PowerShell,在内存中运行程序等之外,这方面的主要问题是我必须评估某些列以识别重复项而不是整个行。

此外,我需要根据包含第一个观察日期的列保留最旧的重复条目。

我尝试了一些不同的事情,例如具有唯一名称的排序对象。

CSV中的数据集通常包含1-5百万行,并且该列看起来类似于:

"LastObserved","FirstObserved","ComputerName","ComputerID","Virtual","ComputerSerialID"
function Request-Dedupe ($data) {
    try {
        Write-Log -Message "Cycling through data to remove duplicates"

        $dedupe_data = @()
        $i = 0
        $n = 0
        foreach ($obj in $data |Sort-Object -Property FirstObserved) {
            if ($obj.ComputerSerialID -notin $dedupe_data.ComputerSerialID -and $obj.ComputerID -notin $dedupe_data.ComputerID) {
                $dedupe_data += $obj
                if ($current_data.ComputerID -contains $obj.ComputerID) {
                   $dedupe_data[$n].LastObserved = $current_time
                }
                $n ++
            }
            Write-Progress -Activity "Cycling through data to remove duplicates and correlate first observed time" -Status "$i items processed" -PercentComplete ([Double]$i / $data.count*100)
            $i ++
        }

        Write-Log -Message "Dedupe Complete"
        return $dedupe_data
    } catch {
        Write-Log -Level Error "Unable to sort and dedupe data"
    }
}
$current_time = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss")
$current_data = Import-Csv .\UniqueSystems.csv
$test = Request-Dedupe $current_data

我的目标是尽可能地加快使用C#的速度。

预期的输出将从CSV中删除所有重复项,并为找到的每个重复项保留最旧的“首次观察”日期。

1 个答案:

答案 0 :(得分:1)

为提高性能,应避免附加到数组以及在数组中进行查找。两者都是缓慢的操作。

如果我正确理解了您的问题,则希望保留唯一的记录,这些记录具有相同的“ ComputerID”和“ ComputerSerialID”以及最早的“ FirstObserved”值。可以使用这样的哈希表来实现:

$unique = @{}
Import-Csv .\UniqueSystems.csv | ForEach-Object {
    $key = '{0}/{1}' -f $_.ComputerID, $_.ComputerSerialID
    if (-not $unique.Contains($key) -or $unique[$key].FirstObserved -gt $_.FirstObserved) {
        $unique[$key] = $_
    }
}
$unique.Values