Powershell 从 csv 中计算相同的值

Powershell counting same values from csv

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

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

有没有办法遍历每一列和每一行来寻找相同的字符串 "a" 并添加到计数中?或者我是否必须对每一列一遍又一遍地执行相同的命令,只是使用不同的关键字?

尝试像这样循环浏览属性:

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

所以我制作了一个包含 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...} 

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

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

那将 return 5 因为 \b 是一个单词边界。本质上,它只是查看每行的逗号或开头或结尾之间的内容。这会忽略您可能拥有的 "Anna" 和 "Annie" 等结果。 Select-Object -ExpandProperty Matches 如果您在一行中有多个匹配项,则很重要。

小警告

这应该无关紧要,但为了保持代码简单,您的 header 可能与您要查找的值相匹配。不太可能,这就是为什么我不考虑它。如果这是可能的,那么我们可以使用 Get-Content 而不是 Select -Skip 1.