Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较2个CSV文件并写入所有差异_Csv_Powershell - Fatal编程技术网

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

比较2个CSV文件并写入所有差异,csv,powershell,Csv,Powershell,我有3个包含用户信息的CSV文件。CSV1是所有非活动用户的“主”列表。CSV2是当前需要停用的用户列表,CSV3是需要激活的用户列表 我想要的是有一个可以从另一个脚本(创建CSV2/3的脚本)调用的PowerShell脚本,让它比较CSV1/2并将所有唯一记录写回CSV1。然后我希望它比较CSV1/3并删除CSV1中存在于CSV3中的所有记录。CSV2/3可以每天更改,其中可能没有数据,但标题除外 有几个独特的字段,但我想比较一下“EmployeeID”。 所有3个CSV文件都有标题(所有文件

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

我想要的是有一个可以从另一个脚本(创建CSV2/3的脚本)调用的PowerShell脚本,让它比较CSV1/2并将所有唯一记录写回CSV1。然后我希望它比较CSV1/3并删除CSV1中存在于CSV3中的所有记录。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
$ICM=Import Csv inactiveicmaster.Csv-标题“StudentDistrictID”、“StudentSiteCode”、“StudentLastName”、“StudentFirstName”、“StudentGradeLevel”、“GraducationYR”、“Masterck”、“Homeroom”、“MiddleName”、“生日”、“性别”、“电子邮件”
$IC=Import Csv Csv\inactiveic.Csv-标题“StudentDistrictID”、“StudentSiteCode”、“StudentLastName”、“StudentFirstName”、“StudentGradeLevel”、“GraducationYR”、“Masterck”、“Homeroom”、“MiddleName”、“Birth”、“Severy”、“Email”
$DIS=导入Csv\disead.Csv-标题“StudentDistrictID”、“StudentSiteCode”、“StudentLastName”、“StudentFirstName”、“StudentGradeLevel”、“GraducationYR”、“Masterck”、“Homeroom”、“MiddleName”、“生日”、“性别”、“电子邮件”
foreach($f,单位为$ic){
$found=$false
foreach($icm中的g){
如果($g.StudentDistrictID-eq$f.StudentDistrictID){
$found=$true
}
}
如果($FOND-eq$false){
$icm+=$f
如果($f.masterck-eq“”){
$f.masterck=“IM”
}
}
}

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

$file1 = import-csv -Path "C:\temp\Test1.csv" 
$file2 = import-csv -Path "C:\temp\Test2.csv" 
Compare-Object $file1 $file2 -property MPFriendlyName
查看此链接以获取完整的示例和结果:

如果您知道这些差异,那么在另一个csv中编写它们就足够容易了

编辑: 我在比较对象方面没有太多经验,但因为它是csv,所以您可以使用此选项删除列

Import-Csv C:\fso\csv1.csv | select ColumnYouWant1,ColumnYouWant2| Export-Csv -Path c:\fso\csvResult.csv –NoTypeInformation
此命令将读取上一个csv并选择要保留的列,然后将其导出为新的csv

添加“远程项目”命令以删除不再需要的任何csv,并完成删除操作。

解决方案:

$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
$ICM=Import Csv-InactiveICMaster.Csv
$IC=导入Csv\unactiveic.Csv
$DIS=导入Csv\disead.Csv
foreach($f,单位为$ic)
{
$found=$false
foreach($icm中的g)
{
如果($g.StudentDistrictID-eq$f.StudentDistrictID)
{
$found=$true
}
}
如果($FOND-eq$false)
{
$icm+=$f
如果($f.masterck-eq“”)
{
$f.masterck=“IM”
}
}
}
$icm |选择*|导出csv InactiveVeicMaster.csv-Notype信息
$icma=导入csv.cmaster.csv

比较对象$icma$dis-property studentdistrictid-passthru |其中对象{$\ SideIndicator-eq“我知道这很古老,但我想为其他寻找此解决方案的人提供答案。我自己尝试使用Compare Object,因为这两个矩阵遇到了一个问题,如果一个矩阵比另一个大,它将永远运行,从而生成一个非常大的矩阵,其中包含大量重复

<>任何人,对于以上的解决方案,你可能会考虑在这个循环中使用一个中断来实现这一点。这将允许你更快地进行比较。SUBE会告诉每个循环第二停止并继续到下一个项目。

对不起,第一次在这里发帖。不知道如何格式化好,我得回去行动了

$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
$ICM=Import Csv-InactiveICMaster.Csv
$IC=导入Csv\unactiveic.Csv
$DIS=导入Csv\disead.Csv
foreach($f,单位为$ic)
foreach($icm中的g){
如果($g.StudentDistrictID-eq$f.StudentDistrictID){
打破
}否则{
$icm+=$f
如果($f.masterck-eq“”){
$f.masterck=“IM”
}
}
}
$icm |选择*|导出csv InactiveVeicMaster.csv-Notype信息
$icma=导入csv.cmaster.csv

比较对象$icma$dis-property studentdistrictid-passthru |其中对象{$\ SideIndicator-eq"要开始,请查看Compare Object cmdlet。如果我从导入中删除-Header,它将只向导出中添加一个。使用-passthru解决此问题,我可以删除CSV1/3中重复的数据。但是,它将SideIndicator添加到csv文件中。我如何不添加它?下面是代码…
$ms=im端口csv master.csv比较对象$ms$dis-属性studentdistrictid-passthru |导出csv inactiveicMastertest.csv-NoTypeInformation