Добрый день! Знатоки, подскажите пожалуйста, каким образом я могу получить разницу двух объектов system.Data.DataTable? Задача сравнить 2 таблицы по ~5000 строк с одинаковыми именами столбцов и
одинаковым количеством и вывести из одной таблицы строки, которых нет в другой. Для большего понимания. С помощью запросов к API я дёргаю из портала данные по пользователям и аккумулирую их в таблицу для последующей синхронизации атрибутов пользователей в Active Directory. Идея сравнивать последнюю полученную таблицу с предыдущей и получать изменённые строки последней таблицы, которых, соответственно, нет в предыдущей. Изменённые строки нужно помещать в аналогичный объект, который потом будет итерироваться и использоваться для изменений в AD. Спасибо!
Сравнение таблиц в PowerShell
Сравнение таблиц в PowerShell
- Fors1k
- Администратор
- Сообщения: 57
- Зарегистрирован: 08 июн 2021, 17:23
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
Re: Сравнение таблиц
Добрый день. Вот этой функцией можно получить строки из $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
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость