String Powershell,计算文本文件中的字符串出现次数

String Powershell,计算文本文件中的字符串出现次数,string,powershell,String,Powershell,我得到了一个如下布局的文本文件 Lorem Ipsum Lorem Ipsum Ipsum user:john Lorem Ipsum user:peter Lorem Ipsum Lorem Ipsum user:george Lorem Ipsum user:john Lorem Ipsum vLorem Ipsum user:george Lorem Ipsum user:john 我必须在Powershell V2上开发一个脚本,以统计发生次数并使用以下内容构建CSV john,3

我得到了一个如下布局的文本文件

Lorem Ipsum Lorem Ipsum Ipsum user:john
Lorem Ipsum user:peter
Lorem Ipsum Lorem Ipsum user:george
Lorem Ipsum user:john
Lorem Ipsum  vLorem Ipsum user:george
Lorem Ipsum user:john
我必须在Powershell V2上开发一个脚本,以统计发生次数并使用以下内容构建CSV

john,3
george,2
peter,1
我计划循环遍历文件,将每个用户保存在一个数组中,然后使用get content和一个模式来计算发生率,例如:

#assumming i was able to fill the array in some way :)
$users =@('john','peter', 'george')
for each ($user in $users)
{
     $count = get-content .\myfile.txt | select-string -pattern "user:$user"
     write-host $count
}
#save the CSV

这有意义吗?我对你的暗示和提示耳熟能详。了解Powershell的强大功能,我是一个优秀的用户,有一个更好的方法。谢谢

使用当前方法,您将为每个用户从磁盘读取一次文件。最好只扫描一次文件,一次收集所有用户

听起来好像你没有提前准备好用户列表,你基本上需要扫描像
user:
这样的字符串,并对你找到的不同用户名进行记录

这里有一个函数可以完成基本工作:

function GetUserCounts($fileName)
{
  $userCounts = @{}

  switch -regex -file $fileName
  {
    '\buser:([a-zA-Z]+)\b' {
       $userName = $matches[1]
       $userCounts[$userName] = [int]$userCounts[$userName] + 1
    }
  }

  $userCounts.GetEnumerator() | select Name,Value
}
然后您可以创建如下CSV:

PS> GetUserCounts .\myfile.txt | Export-Csv .\counts.csv

下面是使用
组对象
cmdlet的另一个选项:

Get-Content lorem.txt | 
Foreach-Object {$_ -replace '^.+user:(.+)$','$1' } | 
Group-Object -NoElement