我需要利用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中删除所有重复项,并为找到的每个重复项保留最旧的“首次观察”日期。
答案 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