2014-02-10 29 views
1

我的PowerShell程序出現了問題,它計算了我正在使用的文件中的句子數。我使用下面的代碼:使用PowerShell計算文件中的句子

foreach ($Sentence in (Get-Content file)) 
{ 
    $i = $Sentence.Split("?") 
    $n = $Sentence.Split(".") 
    $Sentences += $i.Length 
    $Sentences += $n.Length 
} 

句子。我應該得到的總數是61,但我得到71,可能有人請幫助我嗎?我的句子也設置爲零。

感謝

+2

我們需要看到您的內容文件,以及你的代碼。 – DiMono

+2

如果在同一行上有多個句子,則可以使用拆分結束重複計算句子。爲什麼不計算'?'和'.'字符的數量? –

+1

@Vasili - 你已經改變了OP的問題的含義,通過修改它來修復它。如果他/她正在對'?'進行分割,然後對'.'進行分割,那麼這就是問題的一部分。 –

回答

0
foreach ($Sentence in (Get-Content file)) 
{ 
    $i = $Sentence.Split("[?\.]") 
    $Sentences = $i.Length 
} 

我編輯你的代碼位。

您正在使用需要.進行轉義,否則PowerShell可識別它作爲一個正則表達式dotall表達,這意味着「任何字符」

所以,你應該在"[?\.]"或類似的拆分字符串。

+1

通過編輯問題可以遮蔽OP遇到的問題。只需回答並顯示你改變的內容以使其正確;不要改變這個問題。 –

+0

這幫助了我一點,我的計數沒有五個句子比我應該多。我只是不知道它從哪裏獲得額外的數字。 – Laitosto

+0

如果你試試這個:''test「-split」。「',你會看到它將它分成4行,因爲'.'的意思是」正則表達式中的任何字符「。 –

0

當計數的句子,你正在尋找的是每個句子結束。儘管如此,分割會在這些結束字符周圍返回一組句子片段,而這些結尾本身是由元素之間的間隙表示的。因此,句子的數量將等於間隔的數量,這是拆分結果中片段的數量的一倍。

當然,作爲Keith Hill上述評論人士指出,實際的分裂是沒有必要的時候可以直接算結束。

foreach($Sentence in (Get-Content test.txt)) { 
    # Split at every occurrence of '.' and '?', and count the gaps. 
    $Split = $Sentence.Split('.?') 
    $SplitSentences += $Split.Count - 1 

    # Count every occurrence of '.' and '?'. 
    $Ends = [char[]]$Sentence -match '[.?]' 
    $CountedSentences += $Ends.Count 
} 



內容test.txt文件:

Is this a sentence? This is a 
sentence. Is this a sentence? 
This is a sentence. Is this a 
very long sentence that spans 
multiple lines? 


此外,對言論澄清Vasili's answer:PowerShell的-split運營商解釋字符串作爲一個正則表達式默認情況下,雖然.NET Split方法o只能使用文字字符串值。

例如:

  • 'Unclosed [bracket?' -split '[?]'將把[?]爲正則表達式字符類和匹配?字符,返回兩個字符串'Unclosed [bracket'''
  • 'Unclosed [bracket?'.Split('[?]')將調用Split(char[])過載和相互匹配[?,並且]字符,返回三個字符串'Unclosed ''bracket',並''