2017-04-19 49 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