2017-04-19 91 views
1

假設我有一個文件numbers.txt我如何總結選擇字符串提取的數字?

 
My number 1 
... 
My number 2 
... 
My number 3 
... 

我試圖計算出上述數字的總和。我從每行提取一個數字,如下所示:

PS > $numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | 
>> select {$_.matches[0].groups[1].Value} 
>> 
PS > $numbers 

$_.matches[0].groups[1].Value 
----------------------------- 
1 
2 
3 

看起來正是我想要總結的。接下來我想申請的措施,對象:

$numbers | measure -sum 
 
measure : Input object "" is not numeric. 
At line:1 char:12 
+ $numbers | measure -sum 
+   ~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidType: (:PSCustomObject) [Measure-Object], 
PSInvalidOperationException 
    + FullyQualifiedErrorId : 
NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand 

我在做什麼錯?

回答

2

您的數組不包含數字,而是包含字符串值的非常長的屬性名稱(您的scriptblock-value)的對象。

Select-Object替換爲Foreach-Object以獲得該值,將其轉換爲int並進行計算。例如:

$numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | Foreach-Object {$_.matches[0].groups[1].Value -as [int] } 
($numbers | measure -sum).Sum 
+0

我可以投它甚至有Select-對象爲int,但我不知道是長度屬性名稱的措施,對象的障礙是什麼? – greatvovan

+0

鑄造零件不是「選擇對象」的問題。問題在於'Select-Object'使用表達式(scriptblock)創建了一個具有相同名稱的屬性。我們可以給這個列另一個名字(@ {n =「ColumnName」; e = {$ _。matches [0] .etc}}'),但由於您只需要這個數字,所以跳過'Select -Object',並使用'Foreach-Object'。 –

+0

我明白了......這並不容易,但對理解有用。所以當我嘗試使用'measure -sum'$ _。matches [0] .groups [1] .Value「'時,它基本上不知道該名稱,對吧?那麼有什麼感覺有我們無法訪問的名字? – greatvovan

1

看起來正是我要總結

不,它不需要,輸出有標題行。如果這是一個整數的簡單數組,那麼它不會,它會簡單地顯示:

1 
2 
3 

你所創建的PowerShell是一個對象數組,每一個屬性叫'$_.matches[0].groups[1].Value'。你需要類似的東西:

$numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | ForEach {$_.matches[0].groups[1].Value} 

改爲。

1

另一種方法:

[email protected]" 
My number {number*:1} 
My number {number*:2} 
"@ 


#verbose version 
(Get-Content C:\temp\number.txt | 
    ConvertFrom-String -TemplateContent $template | 
     measure -Sum number).Sum 

#short version 
(gc C:\temp\number.txt | cfs -TemplateContent $template | Measure -Sum number).Sum 
+0

不錯,但只有字符串是固定格式,只有數字可以更改纔有效,對嗎?在現實生活中,我有這樣的日誌行:'{date} [{thread}]得到N個消息{guid}'。 – greatvovan

+1

如果字符串是數字(1,2,123,123.456),它將起作用。給你的內容文件的完整例子 – Esperento57

+0

'23:52:49 [10]得到2條消息\ 23:52:50 [12]一些不相關的東西\ 23:52:51 [42]得到5條消息\ ...' – greatvovan