2013-01-28 2 views
3

근무중인 직원의 정보가 들어있는 두 개의 .CSV 파일이 있습니다. 첫 번째 파일 (ActiveEmploye.csv)에는 2500 개의 항목이있는 약 70 개의 필드가 있습니다. 다른 하나 (EmployeEmail.csv)에는 네 개의 필드 (이름, 성, 전자 메일, 전체 이름)와 700 개의 항목이 있습니다. 두 파일 모두 FullName 필드를 공통으로 가지고 있으며 각 파일을 비교하는 데 사용할 수있는 유일한 방법입니다. 내가해야 할 일은 EmployeeEmail.csv의 이메일 주소를 ActiveEmploye.csv의 해당 직원에게 추가하는 것입니다. 이메일 주소가없는 사용자의 경우 입력란을 비워 둘 수 있습니다.두 CSV 파일을 PowerShell과 병합하는 방법

몇 일 전 인터넷에서 찾은 Join-Object 함수를 사용하려고했지만 첫 번째 CSV 파일에 함수의 너무 많은 필드가 포함되어 처리 할 수 ​​없습니다.

의견을 보내 주시면 감사하겠습니다.

답변

4

아마도이 고양이를 스킨하는 데는 여러 가지 방법이 있습니다. 나는이 일을 시도 할 것입니다 :

여기
Import-Csv EmployeeEmail.csv | ForEach-Object -Begin { 
    $Employees = @{} 
} -Process { 
    $Employees.Add($_.FullName,$_.email) 
} 

Import-Csv ActiveEmployees.csv | ForEach-Object { 
    $_ | Add-Member -MemberType NoteProperty -Name email -Value $Employees."$($_.FullName)" -PassThru 
} | Export-Csv -NoTypeInformation Joined.csv 
+0

이상한 이유로 Joined.csv에는 코드와 같이 "이메일"필드가 추가되어 모든 직원에게 공백으로 표시됩니다. – DarKZoNe

+2

흠, 가장 먼저 나타나는 부분 : csv의 입력란이 "fullname"이 아닌지 확인하십시오. 예 : 후행 공간으로 ...? 몇 가지 테스트 코드로 시도해 보았지만 나에게 도움이되었지만 CSV 필드의 후행 공백은 나를 몇 번이나 물었다. 그래서 처음으로 추측했다. 이메일 입력란과 동일합니다. – BartekB

+0

당신 말이 맞아요, 뒷 공간이 비난받을 것입니다! 이제는 .CSV 파일의 모든 공백이 아닌 각 필드의 끝 부분에서만 공백을 제거하는 Regex를 찾아야합니다. 당신의 도움을위한 Thx – DarKZoNe

0

내가 왼쪽으로 여러 필드를 결합하는 데 사용 및 처리 시간에 대한 더 나은 결과를 가지고 @BartekB하는 다른 방법입니다.

Import-Csv EmployeeEmail.csv | ForEach-Object -Begin { 
    $Employees = @{} 
} -Process { 
    $Employees.Add($_.FullName,$_) 
} 

Import-Csv ActiveEmployees.csv | 
    Select *,@{Name="email";Expression={$Employees."$($_.FullName)"."email"}} | 
     Export-Csv Joined.csv -NoTypeInformation 

이렇게하면 $ Employees의 FullName 배열 색인을 쿼리 한 다음 해당 요소에서 명명 된 구성원의 값을 가져올 수 있습니다.

관련 문제