Сравнение двух CSV для похожих строк - PullRequest
0 голосов
/ 16 января 2020

Я сейчас пытаюсь сравнить два CSV. В doc1 содержится 5000 строк, а в doc2 - 100 строк. Каждая строка в doc2 оканчивается на «admin». Я хочу сравнить doc1 и doc2 и найти все строки, которые совпадают до точки, в которой он достигает "admin".

, например,

строка в doc1

строка в doc1 admin

она выведет их обоих в новый CSV

results = foreach ($OU in $OUs) { 
Get-ADGroup -SearchBase $OU -Filter * -Properties CanonicalName,Created,Description,ManagedBy,Member,MemberOf,Members,ObjectGUID,whenChanged | 
? {($_.ManagedBy -like $null) -and ($_.Description -notlike "*owner*") -and ($_.CanonicalName -notlike "*admin")}
}
$results | select CanonicalName,Description,ManagedBy,Member,MemberOf,Members,ObjectGUID,Created,whenChanged |
Export-Csv .\doc1.csv -NoTypeInformation

$results0 = foreach ($OU in $OUs) { 
Get-ADGroup -SearchBase $OU -Filter * -Properties CanonicalName,Created,Description,ManagedBy,Member,MemberOf,Members,ObjectGUID,whenChanged | 
? {($_.ManagedBy -like $null) -and ($_.Description -notlike "*owner*") -and ($_.CanonicalName -like "*admin")}
}
$results0 | select CanonicalName,Description,ManagedBy,Member,MemberOf,Members,ObjectGUID,Created,whenChanged |
Export-Csv .\doc2.csv -NoTypeInformation

$csvPath1 = ".\doc1.csv"
$csvPath2 = '.\doc2.csv'
$propertyToCompare = 'CanonicalName'
$csv1 = Import-Csv -Path $csvPath1
$csv2 = Import-Csv -Path $csvPath2
$duplicates = Compare-Object $csv1 $csv2 -Property $propertyToCompare -ExcludeDifferent -PassThru | Select-Object -ExpandProperty $propertyToCompare
$csv1 | Where-Object { $_.$propertyToCompare -in $duplicates } | Export-Csv -Path .\AdminsAndNotAdminsInOneFile.csv -NoTypeInformation

С Compare-Object я не знаю, как заставить его игнорировать последние несколько символов в строка в doc2. Есть ли способ для меня изменить строку?

1 Ответ

1 голос
/ 16 января 2020

Вы можете воспользоваться тем фактом, что Compare-Object поддерживает вычисленные свойства в качестве свойств сравнения (здесь передается только блок скрипта ({...}), что аналогично передаче
@{ Expression = { ... } }):

Compare-Object $csv1 $csv2 -ExcludeDifferent -IncludeEqual -PassThru -Property {
    $_.$propertyToCompare -replace ' admin$'
  } | Select-Object -ExpandProperty $propertyToCompare

Обратите внимание, что -PassThru обеспечивает прохождение входных объектов, что в случае объектов, которые сравниваются как равно , означает, что Объект LHS ($csv1) пропускается.

Выражение $_.$propertyToCompare -replace ' admin$', которое оценивается для каждого входного объекта, использует регулярное выражение admin$ до , заменяет ' admin' в конец ($) стоимости имущества $propertyToCompare; если эта строка отсутствует, значение используется как есть.

Фактически объекты сравниваются так, как если бы конечного значения ' admin' не было.

...