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

Ответить
Karen
Сообщения: 12
Зарегистрирован: 20 авг 2021, 10:34
Поблагодарили: 1 раз

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

Сообщение Karen »

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

Аватара пользователя
Fors1k
Администратор
Сообщения: 57
Зарегистрирован: 08 июн 2021, 17:23
Благодарил (а): 4 раза
Поблагодарили: 3 раза

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

Сообщение 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
Karen
Сообщения: 12
Зарегистрирован: 20 авг 2021, 10:34
Поблагодарили: 1 раз

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

Сообщение Karen »

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

Аватара пользователя
Fors1k
Администратор
Сообщения: 57
Зарегистрирован: 08 июн 2021, 17:23
Благодарил (а): 4 раза
Поблагодарили: 3 раза

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

Сообщение Fors1k »

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

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей