2017-09-26 50 views
0

我正在编写一个函数来比较两个CSV,但一旦我找到比较部分,就会收到错误。 我只想指出那些列入其中之一的元素。用于比较2个CSV的丢失元素的函数

实际代码

function Compare ($location1, $location2) 
{ 
    #work in progress 
    $CSV1 = Import-Csv -Path $location1 -UseCulture 
    $CSV2 = Import-Csv -Path $location2 -UseCulture 
    $Compared = Compare-Object -ReferenceObject $CSV1 -DifferenceObject $CSV2 | 
       select -ExpandProperty InputObject | 
       sort 
    [void] $CSV1 
    [void] $CSV2 
    return $Compared 
} 

和来自两个CSV的一个片段:

列表A:

 
a 
b 
c 
d 
e 
f 
g 

片段B:

 
a 
b 
c 
d 
e 
h 
f 
g 
h 
i 
j 

那些是用于测试目的看看它是否rks,但现在它甚至没有开始比较。

当我在控制台中查找时,两个CSV会正确加载。

回答

1

我会去这样的:

我已经添加了名为“名称”的第一行上的列名。因此,使用该设置,您可以将其作为属性进行访问。 所以

$CSV1 = $null 
$CSV2 = $null 

$CSV1 = Import-Csv -Path 'C:\temp\pos\reference.csv' 
$CSV2 = Import-Csv -Path 'C:\temp\pos\difference.csv' 

$dif = Compare-Object -ReferenceObject $CSV1 -DifferenceObject $CSV2 -Property Name 

foreach($y in $dif){ 
    if($y.SideIndicator -eq "=>"){ 
    write-output $y.name "Is present in the difference but not in reference." 
    } 
    if($y.SideIndicator -eq "<="){ 
    write-output $y.Name "Is present in reference but not in difference" 
    } 

} 

<# content csv1 (reference.csv) 
Name 
a 
b 
c 
5 
d 
e 
f 
g 
9 
#> 
<#content csv2 (difference.csv) 
Name 
a 
b 
c 
d 
e 
f 
g 
h 
i 
j 
k 
l 
m 
n 
o 
p 
#> 

这会给我的输出:

h Is present in the difference but not in reference. 
i Is present in the difference but not in reference. 
j Is present in the difference but not in reference. 
k Is present in the difference but not in reference. 
l Is present in the difference but not in reference. 
m Is present in the difference but not in reference. 
n Is present in the difference but not in reference. 
o Is present in the difference but not in reference. 
p Is present in the difference but not in reference. 
5 Is present in reference but not in difference 
9 Is present in reference but not in difference 
1

恐怕比较对象不喜欢的工作。根据我的理解,你正试图在两者中找到独特的物品。最简单的方法是将两个CSV添加在一起,然后在要获取唯一属性的属性上执行select-object -Unique

($csv1 + $csv2).Name | Select-Object -Unique 

在这里,我认为在CSV数据的列名是“名称”

+0

我是否能够指出哪CSV的是commin? – Kevin

+0

这需要更精细的脚本。一种简单的方法是在每行中添加另一列到您的csv文件[手动或编程]并使用相应的文件名。然后,一旦添加它,每个数据将在新添加的列中有其来源。 如果数据存在于两个文件中,您将需要额外的逻辑,否则会导致冲突。 –

+0

这听起来相当困难和困惑寿,所以没有一个更简单的方法来得到这个工作? – Kevin