【问题标题】:Powershell counting same values from csvPowershell 从 csv 计算相同的值
【发布时间】:2015-04-09 03:17:58
【问题描述】:

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

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

有没有办法遍历每一列和每一行寻找相同的字符串“a”并添加到计数?还是我必须为每一列一遍又一遍地执行相同的命令,只是使用不同的关键字?

【问题讨论】:

  • 如果您只是想计算 CSV 文件中字符串的出现次数,请将其作为文本而不是 CSV 导入并以这种方式匹配字符串。或者更好的是,在文件上使用 Select-String 并指定 -allmatches 参数。

标签: powershell csv count


【解决方案1】:

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

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

小警告

这无关紧要,但在尝试保持代码简单时,您的标头可能会与您要查找的值匹配。不太可能,这就是为什么我不考虑它的原因。如果这是可能的,那么我们可以使用Get-Content 来代替Select -Skip 1

【讨论】:

    【解决方案2】:

    尝试循环访问这样的属性:

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

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多