【问题标题】:Compare two csv files and find discrepancies比较两个 csv 文件并找出差异
【发布时间】:2012-01-10 07:20:33
【问题描述】:

我是 powershell 世界的新手,我有一些关于 powershell 的项目用于库存核对。

我不知道如何继续,我尝试了一些基本步骤,我能够导出

用户/组/组成员资格。

以下是要求:

  • 现在我所取得的成就 - 感谢 Govnah

广告查询:

Get-QADUser -searchRoot $OuDomain -SizeLimit 0 |
Select-Object dn, sAMAccountName, @{Name="Groups";Expression={(Get-QADMemberOf $_ | Select-Object -expandProperty Name) -join ";"}} | 
Sort-Object SamAccountName | 
export-csv $FilePath

我现在有两个 csv 文件,例如 AD_users.csvOracle_users.csv

我想比较两个文件并重定向差异,例如

Oracle 中不存在 AD 用户 AD 中不存在 Oracle 用户

样本数据

AD_users.csv

u388848993
K847447388
u994888484

Oracle_users.csv

k095848889
u388848993

我可以查询oracle数据库,AD查询也可以,唯一担心的是我无法比较输出。

【问题讨论】:

  • 让我们看看您的 CSV 文件数据。用两者的例子更新你的问题。用示例文本替换敏感信息。
  • 这些是 csv 文件中唯一的列吗?顶部不应该还有列名吗?
  • 正如@user978511 指出的那样,您似乎缺少标题dn, sAMAcountName, Groups 和相关的数据示例文本。

标签: powershell


【解决方案1】:

我在我写的脚本中做了这样的事情:

[System.Collections.ArrayList]$adlist = Get-Content c:\users\sverker\desktop\ad.csv |Sort-Object
[System.Collections.ArrayList]$oraclelist = Get-Content c:\users\sverker\desktop\oracle.csv |Sort-Object
$Matching_numbers = @()

ForEach ($number in $adlist)
{
  if ($oraclelist.Contains($number))
  {
        $Matching_numbers += $number
  }
}
ForEach ($number in $Matching_numbers)
{
  $adlist.Remove($number)
  $oraclelist.Remove($number)
}

现在 $Matching_numbers 现在包含匹配的数字 $adlist 仅包含 AD 中的数字 和 $oraclelist 仅来自 Oracle 的数字

然后您可以遍历列表并显示值:

Write-Host "Matches:"
ForEach ($value in $Matching_numbers)
{
  $Message += $value + [Environment]::NewLine
}
Write-Host $Message

Write-Host "AD only:"
ForEach ($value in $adlist)
{
  $MessageAd += $value + [Environment]::NewLine
}
Write-Host $MessageAd

Write-Host "Oracle only:"
ForEach ($value in $oraclelist)
{
  $MessageOracle += $value + [Environment]::NewLine
}
Write-Host $MessageOracle 

或者直接写

$Matching_numbers

将列表输出到控制台

你可以将 $Message 变量输出到一个文件中。

毫无疑问,有一种更好的方法可以做到这一点,但这对我来说适用于某种类型的文件。

【讨论】:

  • 是的,我怎么没想到。猜猜我还是不明白Powershell有.Net的力量:)我会更新答案
  • 现在你提到它很明显:)
  • 那么您应该只将 $oraclelist 和 $adlist 写入输出,可能使用$oraclelist | Out-File C:\oracleonly.txt
  • 不,这花了很多时间,仍然重定向到 Match User id ,用户 id 包含在两个文件中。没有区别
  • 您好,请您帮忙找出差异,我得到的只是匹配的记录
猜你喜欢
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 2013-06-17
  • 2016-12-24
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多