2013-05-28 22 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

相關問題