比较两个CSV并仅导出两个中不存在的名称列表

时间:2017-02-20 08:03:31

标签: powershell csv compareobject

我有2个带有用户名的CSV文件 我只想导出两个文件中不存在的用户名。

我现在的代码:

$file1 = import-csv -Path "C:\ps\output\adusers.csv" 
$file2 = import-csv -Path "C:\ps\output\users.csv" 
Compare-Object $file1 $file2 -property name | Export-Csv -NoTypeInformation -Path "C:\ps\result\result.csv"

4 个答案:

答案 0 :(得分:2)

使用Select-Object name仅从Compare-Object的输出中提取名称字段:

Compare-Object $file1 $file2 -Property name |
    select name |
    sort -unique -Property name |
    Export-Csv -NoTypeInformation -Path "C:\ps\result\result.csv"

注意:

  • sort -unique对列表进行重复数据删除和排序。
  • 如果CSV很大,请使用HashSet

答案 1 :(得分:1)

尝试使用<div> <div class="col-md-7"> <input class="form-control input-md" type="text" (keydown)="eventHandler($event)" maxlength="11"> <small *ngIf="!validTime" class="text-danger"> Invalid time </small> </div> </div> 仅用于 file1 的差异:

Compare-Object

如果您希望所有差异(来自两个文件)删除此部分:

$file1=import-csv "C:\temp\test\adusers.csv" 
$file2=import-csv "C:\temp\test\users.csv"

Compare-Object $file1 $file2 -Property "Name" | 
    Where SideIndicator -eq "<=" |
    Select Name | 
    Export-Csv "C:\temp\test\result.csv" -NoType

答案 2 :(得分:1)

如果您不介意using linq/NET,这将列出BOTH列表中的用户:

$file1 = import-csv -Path "C:\ps\output\adusers.csv" 
$file2 = import-csv -Path "C:\ps\output\users.csv" 
[linq.enumerable]::intersect( [object[]]($file1.name), [object[]]($file2.name) ) | 
  Export-Csv -NoTypeInformation -Path "C:\ps\result\result.csv"

Linq没有相反/反向交叉的方法,但您可以使用通用集合中的SymmetricExceptWith

下面的代码列出了一个列表或另一个列表中但不同时出现的用户:

$file1 = import-csv -Path "C:\ps\output\adusers.csv" 
$file2 = import-csv -Path "C:\ps\output\users.csv" 
$res = [Collections.Generic.HashSet[String]]( [string[]]($file1.name) )
$res.SymmetricExceptWith( [string[]]($file2.name) )
$res | Export-Csv -NoTypeInformation -Path "C:\ps\result\result.csv"

注意:此代码可能不适用于早期的PowerShell版本。

答案 3 :(得分:0)

使用SideIndicator获取差异。

$file1 = import-csv -path C:\Output\Test.csv
$file2 = import-csv -path C:\Output\DomainUsers.csv
Compare-Object $file1 $file2 -property name -IncludeEqual | where-object {($_.SideIndicator -eq "=>") -or ($_.SideIndicator -eq "<=") } | Export-csv C:\Output\Difference.csv –NoTypeInformation

注意:您也可以使用 sort -unique

希望它有所帮助。