将数字添加到2个总计中并将其放入每个自己的变量中

时间:2013-05-28 20:19:27

标签: powershell powershell-v3.0

希望你能帮助我解决这个小难题。

我有一个txt文件,如下所示:

  

firstnumbers

     

348.92

     

237

     

230

     

329.31

     

secondnumbers

     

18.21

     

48.92

     

37

     

30

     

29.31

这是一个txt文件,其中一列有2个字符串,每行有一些数字。

我想取每列的总数并将其放入每个变量中,比如说$ a和$ b 是的它是1列,只是为了确保没有误解

如果我对每列数字使用2个文件而没有标题(字符串)

,这很容易
$a = (Get-Content 'firstnumbers.txt' | Measure-Object -Sum).Sum
$b = (Get-Content 'secondnumbers.txt' | Measure-Object -Sum).Sum

但是将它们放在一个txt文件中会更酷一点,就像前面提到的那样,每行都有一个标题。

我尝试删除$a.Replace("first", $null).Replace("sec", $null) and then doing a $b.Split(" ")[1,2,3,4,5]| measure -sum结尾的标题 这给了我正确数量的第一个数字 - 但是如果我每次都没有保留特定的数字,它将无法工作。他们会改变,而且会有更多或更少。

我猜这应该很容易。我现在似乎无法掩饰其中的一切。

任何建议都很棒!

欢呼声

2 个答案:

答案 0 :(得分:0)

这样的事情应该有效:

$file = "C:\path\to\your.txt"

[IO.File]::ReadAllText($file) | % {
  $_ -replace "`n+([0-9])", ' $1' -split "`n"
} | ? { $_ -ne "" } | % {
  $a = $_ -split " ", 2
  $v = $a[1] -split " " | Measure-Object -Sum
  "{0}`t{1}" -f ($a[0], $v.Sum)
}

输出:

firstnumbers    1145,23
secondnumbers   163,44

答案 1 :(得分:0)

这是另一种方法,而不是将文本解析为一个大blob,您可以测试每一行以查看它是否包含#或文本,如果是文本,则它会触发在哈希表中创建新条目总和存储:

# C:\Temp> get-content .\numbers.txt | foreach{
    $val=0;
    if([Decimal]::TryParse($_,[ref]$val)){
        $sums[$key]+=$val
    }else{
        $sums += @{"$_"=0}; #add new entry to hashtable
        $key=$_;}
    } -end {$sums}

Name                           Value                                                                                                                       
----                           -----                                                                                                                       
secondnumbers                  163.44                                                                                                                      
firstnumbers                   1145.23   

编辑如评论中所述,每次运行都会保留$ sums变量,如果您运行此命令两次会导致问题。您可以在每次运行后调用Remove-variable sums,或者将其添加到end处理块中,如下所示:

# C:\Temp> get-content .\numbers.txt | foreach{
    $val=0;
    if([Decimal]::TryParse($_,[ref]$val)){
        $sums[$key]+=$val
    }else{
        $sums += @{"$_"=0}; #add new entry to hashtable
        $key=$_;}
    } -end {$sums; remove-variable sums;}