2012-09-20 1 views
1

그래서 나는 2 개의 CSV 파일을 병합하는 방법을 찾고 있습니다. 나는 모두를 병합하는 경우, 출력/결과가 있어야한다 지금값 "이름"및 병합 개수 (Powershell)로 2 CSV 병합

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" 
다음

내가 무엇을 의미하는지에 대한 예입니다

많이 ried했지만 나는 결코 suscess을 가지고 있지 않았다. 나는 항상 잘못된 결과를 보았습니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까? CSV 파일과 해시 테이블에 각 변환

+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

가져 오기 후 일반적인 이름을 찾을 :

$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

이렇게하면 CSV1에없는 이름을 모두 무시합니다. – latkin

+0

@latkin Good point. 이 경우에 업데이트되었습니다. – David

+0

@Coral Doe : 이것은 내가 시도한 것입니다. [meta] $ neu = import-csv today.csv $ full = import-csv complete.csv $ names = $ full | -ExpandProperty 이름을 선택하십시오. $ row = 0 foreach ($ neu에서 $ name) { if ($ names-contains $ neu [$ row] .name) { [int] $ full [($ name | linenumber-1] .count = [int] $ full [($ names | Select-String ($ neu [$ row] .name)). linenumber-1]. count + [int] @ ($ neu [$ row]). 카운트 $ 행 ++ } [/ meta] 이것은 내 시도 중 하나입니다. 나는 그것이 어떻게 든 실패 할 것이다라는 것을 안다 (그것은 다른 csv에없는 이름을 위해 doesnt 한 일을한다. 그러나 그것은 전혀 doesnt 한 심지어 일한다). 편집 : 나는 여기서 편집기와 약간의 문제가있다 – kon