2012-09-20 69 views
1

所以在momemt我正在尋找一種方法來合併2個CSV文件。合併2 CSV的價值「名稱」和合並計數(Powershell)

這裏是我的意思的例子:

CSV1

"Name","Count" 
"Klaus","3" 
"Hans","2" 
"Gerhard","1" 
"Nina","6" 
"Julia","10" 
"Caro","19" 

CSV2

"Name","Count" 
"Klaus","2" 
"Hans","1" 
"Gerhard","1" 
"Nina","1" 

現在,如果我合併兩者的輸出/結果應該是:

"Name","Count" 
"Klaus","5" 
"Hans","3" 
"Gerhard","2" 
"Nina","7" 
"Julia","10" 
"Caro","19" 

I t很多,但我從來沒有過任何麻煩。我總是有錯誤的結果。有沒有人有一個想法如何做到這一點?

+0

你能告訴我們PowerShell中的代碼嗎?你曾經看過你做錯了什麼? –

回答

2

您可以通過Name財產使用Group-Object(化名group)到組的一切。那麼你只需要總結組中每個傢伙的Count屬性。 Measure-Object(別名measure)會爲你做總和。

$grouped = Import-Csv .\csv1.csv, .\csv2.csv | group Name 
$combined = $grouped |%{ 
    New-Object PsObject -Prop @{ Name = $_.Name; Count = ($_.Group | measure -sum -prop Count).Sum } 
} 
$combined | Export-Csv .\combined.csv -NoType 
+0

建議使用'Export-Csv -notype'來避免在輸出文件中獲取類型信息。 – David

+1

不知道爲什麼他們不只是使默認... – EBGreen

+0

好建議,完成 – latkin

0

導入CSV文件,並轉換每到一個哈希表,然後找到共同的名字:

$csv1 = Import-Csv -Path csv1.csv 
$csv2 = Import-Csv -Path csv2.csv 

$HashCSV1 = @{} 
$HashCSV2 = @{} 
$HashMerge = @{} 

foreach($r in $csv1) 
{ 
    $HashCSV1[$r.Name] = $r.Count 
} 

foreach($r in $csv2) 
{ 
    $HashCSV2[$r.Name] = $r.Count 
} 

foreach ($key in $HashCSV1.Keys) { 
    if ($HashCSV2.ContainsKey($key)) { 
     $HashMerge[$key] = [int]$HashCSV1[$key] + [int]$HashCSV2[$key] 
    } else { 
     $HashMerge[$key] = $HashCSV1[$key] 
    } 
} 

foreach ($key in $HashCSV2.Keys) { 
    if (-not $HashCSV1.ContainsKey($key)) { 
     $HashMerge[$key] = $HashCSV2[$key] 
    } 
} 

&{$HashMerge.getenumerator() | 
    foreach {new-object psobject -Property @{Name = $_.name;Count=$_.value}} 
    } | export-csv merge.csv -notype  
+0

這將丟棄CSV2中不在CSV1中的任何名稱 – latkin

+0

@latkin好點。針對該情況更新。 – David

+0

@Coral Doe:這是我試過的 [meta] $ neu = import-csv today.csv $ full = import-csv complete.csv $ names = $ full |選擇-ExpandProperty Name $ row = 0 foreach($ name in $ neu){ if($ names -contains $ neu [$ row] .name) { [int] $ full [($ names | Select-字符串($ neu [$ row] .name))。linenumber-1] .count = [int] $ full [($ names | Select-String($ neu [$ row] .name))。linenumber-1]。 count + [int] @($ neu [$ row])。count } $ row ++ } [/ meta] 這是我的一個嘗試。我知道它會以某種方式失敗(它不適用於名稱不在其他CSV中,但它甚至不起作用)。編輯:我在這裏編輯有點問題 – kon