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
.
使用 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
.