Эффективный способ удаления дубликатов из больших двумерных массивов в PowerShell - PullRequest
0 голосов
/ 05 июня 2019

У меня большой набор данных, примерно 10 миллионов элементов, которые мне нужны для эффективной обработки и быстрого удаления дублирующихся элементов на основе двух из шести заголовков столбцов.

Я пробовал группировать и сортировать предметы, но это ужасно медленно.

$p1 = $test | Group-Object -Property ComputerSeriaID,ComputerID 
    $p2 =  foreach ($object in $p1.group) { 
           $object | Sort-Object -Property FirstObserved | Select-Object -First 1
        }

Цель состоит в том, чтобы удалить дубликаты путем оценки двух столбцов при сохранении самой старой записи на основе первого наблюдения.

Данные выглядят примерно так:

LastObserved: 2019-06-05T15: 40: 37 FirstObserved: 2019-06-03T20: 29: 01 ComputerName: 1 ComputerID: 2 Виртуальный: 3 ComputerSerialID: 4

LastObserved: 2019-06-05T15: 40: 37 FirstObserved: 2019-06-03T20: 29: 01 ComputerName: 5 ComputerID: 6 Виртуальный: 7 ComputerSerialID: 8

LastObserved: 2019-06-05T15: 40: 37 FirstObserved: 2019-06-03T20: 29: 01 ComputerName: 9 ComputerID: 10 Виртуальный: 11 ComputerSerialID: 12

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Это делает это?Он сохраняет тот, который находит первым.

$test | sort -u ComputerSeriaID, ComputerID 
0 голосов
/ 06 июня 2019

Возможно, вы захотите немного прояснить свой вопрос, потому что его немного сложно прочитать, но я постараюсь ответить как можно лучше, исходя из того, что я могу понять о том, что вы пытаетесь сделать.

К сожалению, с таким большим количеством данных нет способа сделать это быстро.Сравнение и сортировка строк выполняется методом грубой силы;нет никакого способа уменьшить сложность сравнения каждого символа в одной строке с другой, кроме как измерить их по одному за раз, чтобы увидеть, одинаковы ли они.

(Честно говоря, если бы это был я, яЯ бы просто использовал export-csv $object и для выполнения этой операции в Excel. Компромисс времени к написанию чего-то подобного только один раз просто не стоил бы.)

По "Предметам" IЯ предполагаю, что вы имеете в виду строки в вашей таблице, и что вы не пытаетесь получить только те строки в строках, которые ищете.Вы уже поняли основную идею выбора объекта, вы можете сделать это для всей таблицы:

$outputFirstObserved = $inputData | Sort-Object -Property FirstObserved -Unique 
$outputLastObserved = $inputData | Sort-Object -Property LastObserved -Unique

Теперь у вас есть ~ 20 миллионов строк в памяти, но я думаю, это лучше, чем делать эторука.Осталось только соединить две таблицы .Вы можете загрузить эту команду Join-Object из галереи powershell с помощью Install-Script -Name Join и использовать ее описанным способом.Если вы хотите выполнить этот шаг самостоятельно, проще всего было бы сложить две таблицы вместе и снова отсортировать их:

$output = $outputFirstObserved + $outputLastObserved
$return = $output | Sort-Object | Get-Unique
...