首页 > 解决方案 > 比较两个 CSV 的相似字符串

问题描述

我目前正在尝试比较两个 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 中字符串中的最后几个字符。有什么方法可以让我修改字符串吗?

标签: powershellactive-directorydata-cleaning

解决方案


您可以利用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'不存在一样。


推荐阅读