Powershell 比较两个csv文件中的列
有了所有的例子,你会认为我可以找到我的解决方案- 无论如何,我有两个csv文件;一个有两列,一个有4列。我需要使用powershell比较每个列中的一个列。我以为我已经弄明白了,但当我比较我的结果时,当我知道它应该是真的时,它又回来了。以下是我目前掌握的情况: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
$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对象中,我不得不修改第二行。如果文件已有标头,则无法指定标头。