【问题标题】:Powershell importing one csv column in array. Contains command doesn`t work with this arrayPowershell 在数组中导入一个 csv 列。包含命令不适用于此数组
【发布时间】:2017-07-20 14:52:00
【问题描述】:

使用 powershell 脚本 我正在以数组形式导入 CSV 文件,一切正常。

$csv = Import-Csv "C:\test.csv" -delimiter ";"

但我无法直接在字段名称 PeopleID 中轻松找到值。 唯一最好的方法是遍历所有数组行并查看我要查找的项目是否存在:

foreach($item in $csv)
{
    if ($csv | where {$item.PeopleID -eq 100263} | select *) { 
       #Good I found it!!!
    }
    $List.add($item.PeopleID) > $null
}

我决定只在数组中直接导入我的列 PeopleID 以使其更快:

$csvPeople = Import-Csv "C:\test.csv" -delimiter ";" | select PeopleID 

如果您看到更高,我还创建了一个数组 $List,它将每个 PeopleID 添加到我的循环中。 所以我有 2 个相同的数组

如果我使用 CONTAINS 命令的问题:

if($csvPeople -contains 100263)
the result is   false 

if($List -contains 100263)
the result is   true

如何让我的 $csvPeople 数组使用“包含”?

导入 csv 列比遍历结果并将其添加到新数组要快,但是这个数组可以正常工作。

当我导入我的 CSV 列以拥有一个“工作”数组时,我是否遗漏了一些东西?

谢谢

【问题讨论】:

  • ... | select PeopleID -> ... | select -Expand PeopleID

标签: arrays powershell csv


【解决方案1】:

我认为您正在寻找 -like 而不是 -contains-contains 对它的使用方式有点挑剔。如果您将 if 语法替换为:

if($csvPeople -like "*100263*")

你应该很高兴。注意两边的通配符,我把它们放在这里是因为我不知道你的数据到底是什么样的。您可以删除它们或更改它们。

必填-like vs -contains 文章如果您有兴趣:http://windowsitpro.com/blog/powershell-contains

此外,@AnsgarWiechers 上面的评论也可以。我相信您仍然需要将您的号码用引号括起来。我不喜欢这样做,因为它需要完全匹配。如果您在 excel 或其他地方使用 CSV,并且您有空格或奇怪的行尾字符,那么您可能无法使用 -contains


我刚刚在您上面的脚本中注意到这一点,您正在加倍努力:

foreach($item in $csv) # <-- Here $item is a record in the CSV
{
    if ($csv | where {$item.PeopleID -eq 100263} | select *) { # <-- Here you are re-parsing the CSV even though you already have the data in $item 
    }
    $List.add($item.Matricule) > $null
}

由于我无法全面了解您正在尝试做什么,因此我提供了一种解决方案,让您可以根据记录匹配并采取行动。

foreach($item in $csv)
{
    if ($item.PeopleID -eq 100263) {
      # Do something with $item here now that you matched it
    }
}

解决您的 191 位用户。我会采取不同的方法。您应该能够将 PeopleID 的原始列表加载到变量中,然后使用 Where 的 -in 功能进行列表到列表的比较。

首先将您的目标 PeopleID 加载到列表中。假设它只是一个平面列表,而不是 csv,您可以像这样进行比较:

$PeopleID_List = Get-Content YourList.txt
$csv | where { $_.PeopleID -in $PeopleID_List } | % { # Do something with the matched record here. Reference it with $_ }

这基本上说明了对于 CSV 中的每条记录,我希望您检查该记录的 peopleID 是否在 $PeopleID_List 中。如果是,请对该记录采取措施。

【讨论】:

  • 不需要引用。 PowerShell 会自动进行相关转换,除非您需要模糊匹配。在这种情况下,-contains 运算符无论如何都不会工作,因为它是为精确匹配而构建的。
  • 是的,like 命令运行良好,但就像我说的那样,它是一个整数数组 (PeopleID),所以我可以有一个 ID = 272 的人和一个 2774 的人,但如果我搜索像 '* 277*',我会找到 2774。所以我需要删除 * ,如果我保留 like 命令,就像 contains 命令他没有找到它一样。(if($csvPeople -like "2774")。什么奇怪的是两个数组看起来都一样,我在循环中添加的那个可以用 contains 找到。
  • 好的,所以我想我困惑的地方是为什么你首先要从 where 子句进行更改。这不能解决你的问题吗? $csvPeople = Import-Csv "C:\test.csv" -delimiter ";" | select PeopleID$csvPeople | where { $_.PeopleID -eq "100263" }
  • @Ty Savercool。在我这边,您的“where”条款不起作用。无论如何,如果它正在工作,它只是绕道而行,因为我必须找到 191 个人,所以使用这个命令行,我必须调用 CSV 191 次。它也没有给出问题的真正答案。尝试拥有我正在寻找的东西只是绕道而行。谢谢
  • @Ty Savercool。当您告诉我导入平面列表时,事实并非如此。这是一个 CSV,这就是我在数组中导入所需列的原因。但是当我在这个数组中搜索时,它没有找到 PeopleID。如果我循环所有 CSV 并创建一个数组,一个一个地添加 peopleID,它就可以工作。现在我每次调用 CSV 并且它工作,但我认为它更慢。 $csvPeople = Import-Csv "C:\test.csv" -delimiter ";" | where-object {( $_.PeopleID -like $item.physicalDeliveryOfficeName )}。这是您 7 月 20 日 @ 19:21 的解决方案,解决了我的问题,但我认为有点慢。
猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 2019-12-14
  • 2017-09-03
  • 2018-09-15
  • 2013-05-06
  • 2022-09-23
  • 1970-01-01
  • 2020-10-21
相关资源
最近更新 更多