使用PowerShell,我可以导入CSV文件并计算有多少对象等于“a”。例如,
@(Import-csv location | where-Object{$_.id -eq "a"}).Count
有没有办法遍历每个列和行,寻找相同的字符串“a”并添加到计数?或者我是否必须为每个列反复执行相同的命令,只需使用不同的关键字?
答案 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
。