手动定义Array vs Import-CSV

时间:2017-04-18 13:08:55

标签: powershell

我在网上看到的一切都说import-csv会创建一个数组,如果是这样的话,那么这两个命令会创建两个独立的数组:

$file1 = @(import-csv -Path "C:\FileInfo\Fileslocal.csv") 
$file2 = @(import-csv -Path "C:\FileInfo\Files.csv")

这两个命令也创建了数组:

$a = @("Scott","Angela","Mike")
$B = @("Scott","Robert","Angela")

但是当我这样做时

$b | Where {$a -NotContains $_}

我将Robert作为回报

但是当我做的时候

$file2 | Where {$file1 -NotContains $_}

我什么都没收到。

1 个答案:

答案 0 :(得分:1)

您不会显示文件的内容,但根据评论和假设,我们会说它们包含带有列标题的文件名列表。那么看看你要比较的两种数据类型..

我们已经定义了您的字符串数组$a$b。然后,您$file1$file1 Import-CSV。查看MSDN Import-CSV ...

  

从CSV文件中的项目创建类似于表格的自定义对象

虽然它们共享相似的属性,但它们实际上是不同类型的对象。如果您使用$file1查看Get-Member的成员,您会看到每列的NoteProperty。

现在来看你的代码

$file2 | Where {$file1 -NotContains $_}

我本以为你会得到的东西,尽管不是你想要的。如果要比较CSV对象中的列,则应在逻辑中使用列名

$file2 | Where {$file1.Name -NotContains $_.Name}

这将返回所有"行"在$file2中,$ file2中的name不在name

$file1列表中

这种类型的比较逻辑没有太多细节,还有其他选择。

  • 只需使用Get-Content阅读它们,如果它的标题为Select-Object -Skip 1,则跳过第一行
  • 考虑Compare-Object。虽然它被认为是一种性能消耗,但它对于较小的数据集应该可以正常工作。
  • 将列表导入为哈希表,这会打开更多比较选项,这些选项性能友好但可能不会显示