2016-09-27 9 views
0

私は2つのCSVを持っています。2つの別々のcsvで2つの列にマッチして1つの列をマージする

SOURCE CSV

"Employee ID","username","givenname","surname","emailaddress","title","Division","Location" 
"204264","[email protected]","Abdul Jalil","Bin Hajar","[email protected]","Warehouse Associate I","Singapore","Singapore, " 
"30053","[email protected]","Abel","Barragan","[email protected]","Manager, Customer Programs - CMS","Germany","Norderstedt, " 

CHANGE CSV

givenname,surname,samaccountname,emailaddress,mail,country,city,state 
Abigai,Teoyotl Rugerio,Abigai.Teoyotl,[email protected],[email protected],MX,, 
Adekunle,Adesiyan,Adekunle.Adesiyan,[email protected],[email protected],US,VALENCIA,CALIFORNIA 

私は変更することがSOURCEから姓とgivennameのに合わせて、好きで、CHANGEからの一致グラブがある場合、 "EMAILADDRESS" でしょうCSVを作成し、ソースCSVの新しい列に配置します。

これまでのところ、姓と名の列が一致していません。あなたはすべてを一度に比較・オブジェクトでそれを行うことができれば

$source = import-csv .\ur.csv 
$change = import-csv .\all.csv 

$Matchgivenname = Compare-Object $source.givenname $change.givenname -IncludeEqual -ExcludeDifferent -PassThru 
$matchsurname = Compare-Object $source.surname $change.surname -IncludeEqual -ExcludeDifferent -PassThru 
+0

あなたの例は意味をなさない。あなたのsource.csvのエントリはchange.csvのものと一致しません。また、source.csvにはすでにemailaddress列が含まれています。 –

+0

これは、各CSVの先頭の数行に過ぎません。ソースには変更が全くないエントリが含まれていますが、その逆もありますが、両方に表示されるいくつかの名前と姓があります。両方に表示される場合は、変更csvからemailaddressを取得したいと思います新しい列のソースcsvに追加してください – 200mg

答えて

0

わからないが、あなたはすべての元従業員を超えると、それぞれに対してループ、任意の変更を検索することができます。例えば

$results = foreach ($employee in $source) 
{ 
    $update = $change | Where-Object { $employee.surname -eq $_.surname -and $employee.givenname -eq $_.givenname } | Select -First 1 

    if ($update) 
    { 
     $employee | Add-Member -MemberType NoteProperty -Name NewEmailAddress -Value $update.emailaddress 
    } 

    $employee 
} 

(未テスト)

+0

これは私が正しい軌道に乗っていると思いますが、それ自体は機能しませんが、これは私を動かすことになります。選択後、最初の1は何をしますか? – 200mg

+0

パイプラインの最初の1つをガードとして選択し、$ changeが同じ人物を複数回持つ場合、$ updateが複数の一致の配列になることはありません。 – TessellatingHeckler

0

場合change CSVは大きいですし、唯一の値としてキーや電子メールなどのgivenname +姓でハッシュテーブルを構築し、変更された電子メールアドレスが必要です。次に、ソースCSVをインポートする際にそれを使用します。

ハッシュテーブルのルックアップは、変更されたデータのすべての行を列挙するよりもはるかに高速です。したがって、全体の反復回数は#changed + #source + log2(#changed)になります。#は行数を表します。

Add-Member経由で新しい列を追加するのは直接割り当てよりも遅いため、最初の行と変更された電子メールから抽出されたソースフィールドで構成されるカスタムヘッダーを使用してこの新しい列を1回追加します。

$changedEmail = @{} 
Import-Csv .\all.csv | 
    ForEach { $changedEmail[$_.givenname + '|' + $_.surname] = $_.emailaddress } 

$newHeader = ((Import-Csv .\ur.csv | Select -first 1).PSObject.Properties | 
    Select -expand name) + 'changedemailaddress' 
$combined = Import-Csv .\ur.csv -Header $newHeader | Select -skip 1 | 
    ForEach { 
     $_.changedemailaddress = $changedEmail[$_.givenname + '|' + $_.surname] 
     $_ 
    } 
$combined 
関連する問題