Страница 1 из 1

Сравнение таблиц в PowerShell

Добавлено: 20 авг 2021, 10:38
Karen

Добрый день! Знатоки, подскажите пожалуйста, каким образом я могу получить разницу двух объектов system.Data.DataTable? Задача сравнить 2 таблицы по ~5000 строк с одинаковыми именами столбцов и
одинаковым количеством и вывести из одной таблицы строки, которых нет в другой. Для большего понимания. С помощью запросов к API я дёргаю из портала данные по пользователям и аккумулирую их в таблицу для последующей синхронизации атрибутов пользователей в Active Directory. Идея сравнивать последнюю полученную таблицу с предыдущей и получать изменённые строки последней таблицы, которых, соответственно, нет в предыдущей. Изменённые строки нужно помещать в аналогичный объект, который потом будет итерироваться и использоваться для изменений в AD. Спасибо!


Re: Сравнение таблиц

Добавлено: 20 авг 2021, 11:00
Fors1k

Добрый день. Вот этой функцией можно получить строки из $dataTable1, которых нет в $dataTable2

Wake up, Neo, select all

Function Compare-Table($t1, $t2){
[System.Void][System.Reflection.Assembly]::
LoadWithPartialName("System.Data.DataSetExtensions")
,[Data.DataRow[]][Linq.Enumerable]::Except(
[Data.DataTableExtensions]::AsEnumerable($t1),
[Data.DataTableExtensions]::AsEnumerable($t2),
[Data.DataRowComparer]::Default
)
}

$diff = Compare-Table $dataTable1 $dataTable2
$diff|ft

Пример для теста:

Wake up, Neo, select all

cls
Function Compare-Table($t1, $t2){
[System.Void][System.Reflection.Assembly]::
LoadWithPartialName("System.Data.DataSetExtensions")
,[Data.DataRow[]][Linq.Enumerable]::Except(
[Data.DataTableExtensions]::AsEnumerable($t1),
[Data.DataTableExtensions]::AsEnumerable($t2),
[Data.DataRowComparer]::Default
)
}

# Создание тестовых таблиц
$dataTable1 = [System.Data.DataTable]::new()
$dataTable2 = [System.Data.DataTable]::new()

$columns1 = @(
[System.Data.DataColumn]::new("id",[int])
[System.Data.DataColumn]::new("text",[string])
)
$columns2 = @(
[System.Data.DataColumn]::new("id",[int])
[System.Data.DataColumn]::new("text",[string])
)

$columns1|ForEach{$dataTable1.Columns.Add($_)}
$columns2|ForEach{$dataTable2.Columns.Add($_)}

$dataTable1.Rows.Add(1, "qwe")|Out-Null
$dataTable1.Rows.Add(2, "asd")|Out-Null
$dataTable1.Rows.Add(3, "zxc")|Out-Null
$dataTable1.Rows.Add(4, "qaz")|Out-Null

$dataTable2.Rows.Add(1, "qwe")|Out-Null
$dataTable2.Rows.Add(2, "asd")|Out-Null

# Сравнение
$diff = Compare-Table $dataTable1 $dataTable2
$diff|ft

Output


id text
-- ----
 3 zxc 
 4 qaz

Re: Сравнение таблиц

Добавлено: 20 авг 2021, 12:42
Karen

Гениально, спасибо огромное!


Re: Сравнение таблиц

Добавлено: 20 авг 2021, 13:12
Fors1k

Пожалуйста, обращайтесь)