比较2个CSV文件并写出所有差异

时间:2016-03-25 13:22:15

标签: csv powershell

我有3个包含用户信息的CSV文件。 CSV1是所有非活动用户的“主”列表。 CSV2是需要停用的当前用户列表,CSV3是需要激活的用户列表。

我想要的是拥有一个PowerShell脚本,可以从另一个脚本(创建CSV2 / 3的脚本)调用它来比较CSV1 / 2并将所有唯一记录写回CSV1。然后我希望它比较CSV1 / 3并删除CSV3中存在的CSV1中的所有记录。 CSV2 / 3可以每天更改,除了标题之外,其中可能没有数据。

有几个独特的字段,但我想比较'EmployeeID'。 所有3个CSV文件都有标题(所有标题都相同,因此数据一致)。

到目前为止,我最终将CSV2中的记录添加到CSV1,但它会添加两个标题。

$ICM= Import-Csv inactiveicmaster.csv -Header 'StudentDistrictID', 'StudentSiteCode', 'StudentLastName', 'StudentFirstName', 'StudentGradeLevel', 'GraduationYr', 'Masterck', 'Homeroom', 'MiddleName', 'Birthday', 'Gender', 'Email'
$IC = Import-Csv csv\inactiveic.csv -Header 'StudentDistrictID', 'StudentSiteCode', 'StudentLastName', 'StudentFirstName', 'StudentGradeLevel', 'GraduationYr', 'Masterck', 'Homeroom', 'MiddleName', 'Birthday', 'Gender', 'Email'
$DIS = Import-Csv csv\disinad.csv -Header 'StudentDistrictID', 'StudentSiteCode', 'StudentLastName', 'StudentFirstName', 'StudentGradeLevel', 'GraduationYr', 'Masterck', 'Homeroom', 'MiddleName', 'Birthday', 'Gender', 'Email'
foreach ($f in $ic) {
  $found = $false
  foreach ($g in $icm) {
    if ($g.StudentDistrictID -eq $f.StudentDistrictID) {
      $found = $true
    }
  }
  if ($found -eq $false) {
    $icm += $f
    if ($f.masterck -eq "") {
      $f.masterck = "IM"
    }
  }
}
<#
foreach ($h in $dis) {
  $found = $false
  foreach ($g in $icm) {
    if ($g.studentdistrictid -eq $h.studentdistrictid) {
      $found = $true
    }
    if ($found -ne $false) {
      #don't know what to do here to remove the duplicate
    }
  }
}
#>
$icm | select * | Export-Csv master.csv -NoTypeInformation

3 个答案:

答案 0 :(得分:3)

我不知道确切的答案,但你不能做这样的事情吗?

$file1 = import-csv -Path "C:\temp\Test1.csv" 
$file2 = import-csv -Path "C:\temp\Test2.csv" 
Compare-Object $file1 $file2 -property MPFriendlyName

查看此链接以获取完整示例和结果:Compare csv with same headers

如果您知道差异,那么在其他csv中编写它们就很容易了。

编辑: 我对compare-objects没有太多经验,但由于它是csv,你可以用这个删除列。

Import-Csv C:\fso\csv1.csv | select ColumnYouWant1,ColumnYouWant2| Export-Csv -Path c:\fso\csvResult.csv –NoTypeInformation

此命令将读取您的上一个csv并选择要保留的列并将其导出到新的csv。

添加一个remote-item命令,删除你不再需要的任何csv,并完成你的工作。

答案 1 :(得分:0)

解决方案:

$ICM= Import-Csv InactiveICMaster.csv
$IC = Import-Csv csv\InactiveIC.csv
$DIS = Import-Csv csv\DisinAD.csv
foreach ($f in $ic)
{
    $found = $false
foreach($g in $icm)
{
    if ($g.StudentDistrictID -eq $f.StudentDistrictID) 
    {
        $found = $true
    }
}
if ($found -eq $false)
{
    $icm += $f
    if ($f.masterck -eq "")
    {
        $f.masterck = "IM"
    }

}
}
$icm | select * | export-csv InactiveICMaster.csv -NoTypeInformation
$icma = import-csv InactiveICMaster.csv
compare-object $icma $dis -property studentdistrictid -passthru|Where-Object {$_.SideIndicator -eq "<="}|select StudentDistrictID,StudentSiteCode,StudentLastName,StudentFirstName,StudentGradeLevel,GraduationYr,Masterck,Homeroom,MiddleName,Birthday,Gender,Email |export-csv inactiveicmastertest.csv -NoTypeInformation
remove-item inactiveicmaster.csv
import-csv inactiveicmastertest.csv|sort StudentDistrictID|export-csv InactiveICMaster.csv -NoTypeInformation
remove-item InactiveICMasterTest.csv

答案 2 :(得分:0)

我知道这已经过时了但是想为其他人寻找这个解决方案。我试图自己使用Compare-Object,因为这两个矩阵但遇到了一个问题,即如果一个比另一个大,它会永远运行,形成一个非常大的矩阵,有很多欺骗。

对于上述解决方案,您可能需要考虑在为此目的嵌套循环时使用中断。它会让你比较快。 Break将告诉第二个for-each循环停止并继续下一个项目。

抱歉,第一次在这里发帖。不知道如何格式化,我必须回到行动。

$ICM= Import-Csv InactiveICMaster.csv
$IC = Import-Csv csv\InactiveIC.csv
$DIS = Import-Csv csv\DisinAD.csv
foreach ($f in $ic)
  foreach($g in $icm){
    if ($g.StudentDistrictID -eq $f.StudentDistrictID){
      break
    }else{
      $icm += $f
      if ($f.masterck -eq ""){
        $f.masterck = "IM"
      }

  }
}
$icm | select * | export-csv InactiveICMaster.csv -NoTypeInformation
$icma = import-csv InactiveICMaster.csv
compare-object $icma $dis -property studentdistrictid -passthru|Where-Object {$_.SideIndicator -eq "<="}|select StudentDistrictID,StudentSiteCode,StudentLastName,StudentFirstName,StudentGradeLevel,GraduationYr,Masterck,Homeroom,MiddleName,Birthday,Gender,Email |export-csv inactiveicmastertest.csv -NoTypeInformation
remove-item inactiveicmaster.csv
import-csv inactiveicmastertest.csv|sort StudentDistrictID|export-csv InactiveICMaster.csv -NoTypeInformation
remove-item InactiveICMasterTest.csv