Powershell Reading text file word by word

情到浓时终转凉″ 提交于 2019-12-07 12:05:22

问题


So I'm trying to count the words of my text file however when I do get-content the array reads them letter by letter and so it doesn't let me compare them word by word. I hope you guys can help me out!

Clear-Host #Functions

function Get-Articles (){

 foreach($Word in $poem){
    if($Articles -contains $Word){
       $Counter++
    }
}
    write-host "The number of Articles in your sentence: $counter"
}

#Variables

$Counter = 0

$poem = $line
$Articles = "a","an","the"

#Logic

$fileExists = Test-Path "text.txt"

if($fileExists) {
    $poem = Get-Content "text.txt"
    }
else
    {
    Write-Output "The file SamMcGee does not exist"  
    exit(0) 
    }

$poem.Split(" ")

Get-Articles

回答1:


What your script does, edited down a bit:

$poem = $line                    # set poem to $null (because $line is undefined)
$Articles = "a","an","the"       # $Articles is an array of strings, ok

                                 # check file exists (I skipped, it's fine)

$poem = Get-Content "text.txt"   # Load content into $poem, 
                                 # also an array of strings, ok

$poem.Split(" ")                 # Apply .Split(" ") to the array.
                                 # Powershell does that once for each line.
                                 # You don't save it with $xyz = 
                                 # so it outputs the words onto the 
                                 # pipeline.
                                 # You see them, but they are thrown away.

Get-Articles                     # Call a function (with no parameters)


function Get-Articles (){        

                                 # Poem wasn't passed in as a parameter, so
 foreach($Word in $poem){        # Pull poem out of the parent scope. 
                                 # Still the original array of lines. unchanged.
                                 # $word will then be _a whole line_.

    if($Articles -contains $Word){    # $articles will never contain a whole line
       $Counter++
    }
}
    write-host "The number of Articles in your sentence: $counter"  # 0 everytime
}

You probably wanted to do $poem = $poem.Split(" ") to make it an array of words instead of lines.

Or you could have passed $poem words into the function with

function Get-Articles ($poem) {
...

Get-Articles $poem.Split(" ")

And you could make use of the PowerShell pipeline with:

$Articles = "a","an","the"

$poemArticles = (Get-Content "text.txt").Split(" ") | Where {$_ -in $Articles}
$counter = $poemArticles | Measure | Select -Expand Count
write-host "The number of Articles in your sentence: $counter"



回答2:


TessellatingHeckler's helpful answer explains the problem with your approach well.

Here's a radically simplified version of your command:

$counter = (-split (Get-Content -Raw text.txt) -match '^(a|an|the)$').count
write-host "The number of articles in your sentence: $counter"

The unary form of the -split operator is key here: it splits the input into words by any run of whitespace between words, resulting in an array of individual words.

-match then matches the resulting array of words against a regex that matches words a, an, or the: ^(a|an|the)$.

The result is the filtered subarray of the input array containing only the words of interest, and .count simply returns that subarray's count.



来源:https://stackoverflow.com/questions/40433898/powershell-reading-text-file-word-by-word

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!