Powershell计算来自csv的相同值

时间:2015-04-09 03:17:59

标签: powershell csv count

使用PowerShell,我可以导入CSV文件并计算有多少对象等于“a”。例如,

@(Import-csv location | where-Object{$_.id -eq "a"}).Count

有没有办法遍历每个列和行,寻找相同的字符串“a”并添加到计数?或者我是否必须为每个列反复执行相同的命令,只需使用不同的关键字?

2 个答案:

答案 0 :(得分:0)

尝试循环使用以下属性:

(Import-Csv location | %{$record = $_; $record | Get-Member -MemberType Properties | 
    ?{$record.$($_.Name) -eq 'a';}}).Count

答案 1 :(得分:0)

所以我创建了一个包含5列人名的虚拟文件。现在向您展示该过程将如何工作,我将向您展示文本" Ann"出现在任何领域。

$file = "C:\temp\MOCK_DATA (3).csv"
gc $file | %{$_ -split ","} | Group-Object | Where-Object{$_.Name -like "Ann*"}

不要专注于代码,而是关注下面的输出。

Count Name  Group                          
----- ----  -----                          
    5 Ann   {Ann, Ann, Ann, Ann...}        
    9 Anne  {Anne, Anne, Anne, Anne...}    
   12 Annie {Annie, Annie, Annie, Annie...}
   19 Anna  {Anna, Anna, Anna, Anna...} 

"安"它出现了5次。然而,它也是其他名称的一部分。让我们使用一个简单的正则表达式来查找只有" Ann"。

的所有值。
(select-string -Path 'C:\temp\MOCK_DATA (3).csv' -Pattern "\bAnn\b" -AllMatches | Select-Object -ExpandProperty Matches).Count

由于\b用于单词边界,因此返回5。本质上它只是查看逗号之间或每行的开头或结尾。这省略了像" Anna"和"安妮"你可能有。如果您在一行中有多个匹配项,则Select-Object -ExpandProperty Matches非常重要。

小警告

这应该没关系,但在尝试保持代码简单时,您的标头可能与您要查找的值匹配。这不太可能是我不能解释的原因。如果有可能,那么我们可以使用Get-Content代替Select -Skip 1