2013-05-28 23 views
0

希望你能帮助我解决这个难题。将数字添加到2个总数中并放入每个变量中

我有一个txt文件看起来像这样:

firstnumbers

348.92

329.31

secondnumbers

18.21

48.92

29.31

所以与具有2个字符串和在每一行上的一些数字一列的txt文件。

我想拿总每一列,并把它变成像比如说$一个每个变量和$ 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 这给了我firstnumbers正确数量的结束 - 但如果我不把组特定的数字,每次它不会工作。他们会改变,会有或多或少的变化。

这应该是很容易,我猜测。此刻,我似乎无法看清楚它的身影。

任何意见都会很棒!

欢呼

回答

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 
+0

真棒的东西。它也可以工作,并且您可以通过以下方式获得一些乐趣:-) – Pieinacup

0

这里的另一种方法,而不是解析文本作为一个大斑点,你可以测试每个线查看它是否包含#或文本,如果是文本,则触发在存储和的哈希表中创建新条目:

# 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 

编辑:正如评论指出的那样,$总和变量仍然存在对于每个如果运行此命令两次导致问题运行。你可以在每次运行后打电话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;} 
+0

酷酷的方法,也很有用! (不过要注意,每次运行时,只能运行一次这样的值) – Pieinacup

+0

@Pieinacup这个脚本在运行之前不会重置'$ sums'。您可以手动执行该操作或相应地更新脚本。查看我的编辑。 – zdan

相关问题