Powershell 比较两个csv文件中的列

Powershell 比较两个csv文件中的列,powershell,Powershell,有了所有的例子,你会认为我可以找到我的解决方案- 无论如何,我有两个csv文件;一个有两列,一个有4列。我需要使用powershell比较每个列中的一个列。我以为我已经弄明白了,但当我比较我的结果时,当我知道它应该是真的时,它又回来了。以下是我目前掌握的情况: $newemp = Import-Csv -Path "C:\Temp\newemp.csv" -Header login_id, lastname, firstname, other | Select-Object "login_id

有了所有的例子,你会认为我可以找到我的解决方案-

无论如何,我有两个csv文件;一个有两列,一个有4列。我需要使用powershell比较每个列中的一个列。我以为我已经弄明白了,但当我比较我的结果时,当我知道它应该是真的时,它又回来了。以下是我目前掌握的情况:

 $newemp = Import-Csv -Path "C:\Temp\newemp.csv" -Header login_id, lastname, firstname, other | Select-Object "login_id"
 $ps = Import-Csv -Path "C:\Temp\Emplid_LoginID.csv" | Select-Object "login id"
 If ($newemp -eq $ps)
    {
      write-host "IDs match" -forgroundcolor green
    }
 Else 
    {
      write-host "Not all IDs match" -backgroundcolor yellow -foregroundcolor black
    }
我必须为第一个文件指定标题,因为它没有任何标题。奇怪的是,我可以调用每个变量来查看它所包含的内容,它们最终得到相同的信息,但由于某些原因仍然显示为false。即使只有一行未计算标题行,也会发生这种情况

我开始将它们解析为数组,但不确定这是否正确。重要的是我将第一个文件的行1与第二个文件的行1进行比较。我不能只做简单的匹配或包含

编辑:一件恼人的事情是变量似乎也包含标题行。当我调用每一个时,都会显示标题。但如果我调用这两个变量,我只看到一个标题,但看到两行

我刚刚添加了以下检查,但得到的结果都是False:

    $results = Compare-Object -ReferenceObject $newemp -DifferenceObject $ps -PassThru | ForEach-Object { $_.InputObject }

使用latkin的答案,我想这会给你你想要的结果集。根据拉特金的评论,财产比较对于你来说是多余的,但我留下了它,因为很高兴知道。此外,即使对于带有标题的csv,也会指定标题,以防止在比较中包括标题行

$newemp = Import-Csv -Path "C:\Temp\_sotemp\Book1.csv" -Header loginid | 
    Select-Object "loginid"

$ps = Import-Csv -Path "C:\Temp\_sotemp\Book2.csv" -Header loginid | 
    Select-Object "loginid"

#get list of (imported) CSV properties
$props1 = $newemp | gm -MemberType NoteProperty | select -expand Name | sort
$props2 = $ps | gm -MemberType NoteProperty | select -expand Name | sort

#first check that properties match 
#omit this step if you know for sure they will be
if(Compare-Object $props1 $props2){
    throw "Properties are not the same! [$props1] [$props2]"
}

#pass properties list to Compare-Object
else{
    Compare-Object $newemp $ps -Property $props1
}

在第二行,我看到有一个空间登录id,而第一行没有。这可能是个问题吗。尝试在.csv文件本身中使用相同的标题名称。它可以在不提供header或select语句的情况下工作。下面是我根据你们的意见做的实验

emp.csv

empids.csv

PS C:\>$newemp=导入csv C:\scripts\emp.csv PS C:\>$PS=导入CSV C:\scripts\empids.CSV PS C:\>$results=Compare Object-ReferenceObject$newemp-DifferenceObject$PS | foreach{$\ u0.InputObject}

显示不在$ps中的差异对象

loginid  firstname  lastname   SideIndicator  
-------  ---------  --------   -------------  
k2340    Naam       mason      <=  
lk10j5   Shaan      kelso      <=  
303sk    Doug       smith      <=  

我不确定这是否是您正在寻找的,但我已经使用PowerShell为自己做了一些CSV格式设置

            $test = Import-Csv .\Desktop\Vmtools-compare.csv
                foreach ($i in $test) {
                    foreach ($n in $i.name) {    
                        foreach ($m in $test) {
                            $check = "yes"         
                            if ($n -eq $m.prod) {
                                $check = "no"
                                break
                            }
                        }
                    if ($check -ne "no") {$n}
                    }
                }
以下是我的excel csv文件的外观:

prod    name
1       3
2       5
3       8
4       2
5       0
prod    name
1       3
2       5
3       8
4       2
5       0
脚本输出如下内容:

8
0
3
5
2
所以基本上,脚本在Name列下获取每个数字,然后对照prod列进行检查。如果数字在那里,则不会显示,否则将显示该数字

我也用了相反的方法:

        $test = Import-Csv c:\test.csv                
            foreach ($i in $test) {
                foreach ($n in $i.name) {                    
                    foreach ($m in $test) {
                        $check = "yes"                         
                        if ($n -eq $m.prod) {echo $n}
                    }
                }
            }
以下是我的excel csv的外观:

prod    name
1       3
2       5
3       8
4       2
5       0
prod    name
1       3
2       5
3       8
4       2
5       0
脚本输出如下内容:

8
0
3
5
2
所以脚本只显示匹配的条目


您可以使用代码查看不同的列。

可能的重复项我肯定会考虑为此使用compare object cmdlet。我不确定交易是什么,但到目前为止没有任何建议起作用。我将标题设置为相同的登录ID,但没有任何帮助。如果运行上述代码,输出是什么针对您的文件?比较对象:无法将System.Management.Automation.PSObject转换为以下类型之一{System.String,System.Management.Automation.ScriptBlock}。在C:\Temp\FileCompare.ps1:17 char:19+Compare对象中,我不得不修改第二行。如果文件已有标头,则无法指定标头。