0

我有一系列文档正在通过以下功能来计算每个文档中的单词出现次数。此功能可以很好地输出到控制台,但现在我想生成一个包含信息的文本文件,但文件名附加到列表中的每个单词。

我当前的控制台输出是:

"processing document1 with x unique words occuring as follows"
"word1     12"
"word2      8"
"word3      3"
"word4      4"
"word5      1"

我想要一个这种格式的分隔文件:

document1;word1;12
document1;word2;8  
document1;word3;3
document1;word4;4
document1;word1;1
document2;word1;16
document2;word2;11 
document2;word3;9
document2;word4;9
document2;word1;13 

虽然下面的函数让我得到单词和出现的列表,但我很难弄清楚在哪里或如何插入文件名变量,以便它打印在每行的开头。MSDN 帮助不大,我尝试插入变量的大多数地方都会导致错误(见下文)

function Count-Words ($docs) {
    $document = get-content $docs 
    $document = [string]::join(" ", $document)        
    $words = $document.split(" `t",[stringsplitoptions]::RemoveEmptyEntries)                             
    $uniq = $words | sort -uniq  
    $words | % {$wordhash=@{}} {$wordhash[$_] += 1}
    Write-Host $docs "contains" $wordhash.psbase.keys.count "unique words distributed as follows."
    $frequency = $wordhash.psbase.keys | sort {$wordhash[$_]}
    -1..-25 | %{ $frequency[$_]+" "+$wordhash[$frequency[$_]]} | Out-File c:\out-file-test.txt -append
    $grouped = $words | group | sort count

我是否需要创建一个字符串以传递给输出文件 cmdlet?这只是我在过去几次尝试中放错地方的东西吗?我想了解为什么它也会出现在特定的地方。现在我只是在猜测,因为我知道我不知道在哪里可以out-file实现我选择的结果。

我已经尝试使用-$docsand来根据 powershell 帮助格式化我的命令-FilePath,但是每次我向out-file上面成功运行的内容添加任何内容时,都会出现以下错误:

Out-File : Cannot validate argument on parameter 'Encoding'. The argument "c:\out-file-test.txt" does not bel
ong to the set "unicode,utf7,utf8,utf32,ascii,bigendianunicode,default,oem" specified by the ValidateSet attribute. Sup
ply an argument that is in the set and then try the command again.
At C:\c.ps1:39 char:71
+     -1..-25 | %{ $frequency[$_]+" "+$wordhash[$frequency[$_]]} | Out-File <<<<  -$docs -width 1024 c:\users\x46332\co
unt-test.txt -append
    + CategoryInfo          : InvalidData: (:) [Out-File], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.OutFileCommand
4

3 回答 3

1

我重写了你的大部分代码。您应该利用对象来更轻松地按照您想要的方式进行格式化。这个拆分“空间”并将单词组合在一起。试试这个:

Function Count-Words ($paths) {
    $output = @()
    foreach ($path in $paths) {
        $file = Get-ChildItem $path 
        ((Get-Content $file) -join " ").Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries) | Group-Object | Select-Object -Property @{n="FileName";e={$file.BaseName}}, Name, Count | % { 
            $output += "$($_.FileName);$($_.Name);$($_.Count)" 
        }
    }
    $output | Out-File test-out2.txt -Append
}

$filepaths = ".\test.txt", ".\test2.txt"

Count-Words -paths $filepaths

它像你问的那样输出(文档;单词;计数)。如果您希望 documentname 包含扩展名,请更改$file.BaseName$file.Name. 测试输出:

test;11;1
test;9;2
test;13;1
test2;word11;5
test2;word1;4
test2;12;1
test2;word2;2
于 2013-02-15T14:12:33.597 回答
0

试试这个:

$docs = @("document1", "document2", ...)

$docs | % {
  $doc = $_
  Get-Content $doc `
    | % { $_.split(" `t",[stringsplitoptions]::RemoveEmptyEntries) } `
    | Group-Object `
    | select @{n="Document";e={$doc}}, Name, Count
} | Export-CSV output.csv -Delimiter ";" -NoTypeInfo

如果你想把它变成一个函数,你可以这样做:

function Count-Words($docs) {
  foreach ($doc in $docs) {
    Get-Content $doc `
      | % { $_.split(" `t",[stringsplitoptions]::RemoveEmptyEntries) } `
      | Group-Object `
      | select @{n="Document";e={$doc}}, Name, Count
  }
}

$files = @("document1", "document2", ...)

Count-Words $files | Export-CSV output.csv -Delimiter ";" -NoTypeInfo
于 2013-02-15T14:38:21.390 回答
0

略有不同的做法:

function Get-WordCounts ($doc)
{
      $text_ = [IO.File]::ReadAllText($doc.fullname)

      $WordHash = @{}

      $text_ -split '\b' -match '\w+'|
        foreach {$WordHash[$_]++}

      $WordHash.GetEnumerator() | 
       foreach {
         New-Object PSObject -Property @{
                                          Word     = $_.Key
                                          Count    = $_.Value
                                         }
               }
  }


$docs = gci c:\testfiles\*.txt |
 sort name

 &{
 foreach ($doc in dir $docs)
        {
           Get-WordCounts $doc |
           sort Count -Descending |
            foreach {
              (&{$doc.Name;$_.Word;$_.Count}) -join ';'  
             }
        }
} | out-file c:\somedir\wordcounts.txt
于 2013-02-15T16:00:13.597 回答