2016-03-25 23 views
2

私は3つのCSVファイルにユーザー情報が含まれています。 CSV1は、すべての非アクティブ・ユーザーの「マスター」リストです。 CSV2は現在非アクティブにする必要のあるユーザーのリストで、CSV3はアクティブにする必要のあるユーザーのリストです。2つのCSVファイルを比較し、すべての相違点を書きます

私が望むのは、CSV1/2を比較してすべてのユニークなレコードをCSV1に書き戻すために、別のスクリプト(CSV2/3を作成するスクリプト)から呼び出せるPowerShellスクリプトを用意することです。次に、CSV1/3を比較し、CSV3に存在するCSV1のすべてのレコードを削除します。 CSV2/3は毎日変更することができ、ヘッダー以外のデータは使用できません。

いくつかの固有のフィールドがありますが、私は 'EmployeeID'を比較したいと思います。 3つのCSVファイルにはヘッダーがあります(すべてが同じヘッダーなので、データは一貫しています)。

これまでのところ、CSV2からCSV1にレコードを追加しますが、両方のヘッダーが追加されます。

$ICM= Import-Csv inactiveicmaster.csv -Header 'StudentDistrictID', 'StudentSiteCode', 'StudentLastName', 'StudentFirstName', 'StudentGradeLevel', 'GraduationYr', 'Masterck', 'Homeroom', 'MiddleName', 'Birthday', 'Gender', 'Email' 
$IC = Import-Csv csv\inactiveic.csv -Header 'StudentDistrictID', 'StudentSiteCode', 'StudentLastName', 'StudentFirstName', 'StudentGradeLevel', 'GraduationYr', 'Masterck', 'Homeroom', 'MiddleName', 'Birthday', 'Gender', 'Email' 
$DIS = Import-Csv csv\disinad.csv -Header 'StudentDistrictID', 'StudentSiteCode', 'StudentLastName', 'StudentFirstName', 'StudentGradeLevel', 'GraduationYr', 'Masterck', 'Homeroom', 'MiddleName', 'Birthday', 'Gender', 'Email' 
foreach ($f in $ic) { 
    $found = $false 
    foreach ($g in $icm) { 
    if ($g.StudentDistrictID -eq $f.StudentDistrictID) { 
     $found = $true 
    } 
    } 
    if ($found -eq $false) { 
    $icm += $f 
    if ($f.masterck -eq "") { 
     $f.masterck = "IM" 
    } 
    } 
} 
<# 
foreach ($h in $dis) { 
    $found = $false 
    foreach ($g in $icm) { 
    if ($g.studentdistrictid -eq $h.studentdistrictid) { 
     $found = $true 
    } 
    if ($found -ne $false) { 
     #don't know what to do here to remove the duplicate 
    } 
    } 
} 
#> 
$icm | select * | Export-Csv master.csv -NoTypeInformation 
+0

開始するには、Compare-Objectコマンドレットを参照してください。 – EBGreen

+0

-Headerをインポートから削除すると、エクスポートに1つだけ追加されます。 –

答えて

1

正確な答えはわかりませんが、このようなことはできませんか?完全な例とその結果については、このリンクで

$file1 = import-csv -Path "C:\temp\Test1.csv" 
$file2 = import-csv -Path "C:\temp\Test2.csv" 
Compare-Object $file1 $file2 -property MPFriendlyName 

見て:あなたは違いを知っている場合Compare csv with same headers

他のcsvファイルでそれらを書くことは十分に簡単です。

編集: 私はcompare-objectsの経験があまりありませんが、これはcsvなので、これで列を削除できます。

Import-Csv C:\fso\csv1.csv | select ColumnYouWant1,ColumnYouWant2| Export-Csv -Path c:\fso\csvResult.csv –NoTypeInformation 

このコマンドは、あなたの最後のCSVファイルを読んで、あなたは維持し、新しいCSVにエクスポートしたい列を選択します。

もう必要のないcsvを削除するには、remote-itemコマンドを追加します。

+0

これを-passthruで処理すると、CSV1/3で複製されたデータを削除できました。しかし、SideIndicatorをcsvファイルに追加します。どのように私はそれを追加しないで行くだろうか?ここにコードはありますか? '$ ms = import-csv ma​​ster.csv compare-object $ ms $ dis -property studentdistrictid -passthru | export-csv inactiveicMastertest.csv -NoTypeInformation' –

0

ソリューション:

$ICM= Import-Csv InactiveICMaster.csv 
$IC = Import-Csv csv\InactiveIC.csv 
$DIS = Import-Csv csv\DisinAD.csv 
foreach ($f in $ic) 
{ 
    $found = $false 
foreach($g in $icm) 
{ 
    if ($g.StudentDistrictID -eq $f.StudentDistrictID) 
    { 
     $found = $true 
    } 
} 
if ($found -eq $false) 
{ 
    $icm += $f 
    if ($f.masterck -eq "") 
    { 
     $f.masterck = "IM" 
    } 

} 
} 
$icm | select * | export-csv InactiveICMaster.csv -NoTypeInformation 
$icma = import-csv InactiveICMaster.csv 
compare-object $icma $dis -property studentdistrictid -passthru|Where-Object {$_.SideIndicator -eq "<="}|select StudentDistrictID,StudentSiteCode,StudentLastName,StudentFirstName,StudentGradeLevel,GraduationYr,Masterck,Homeroom,MiddleName,Birthday,Gender,Email |export-csv inactiveicmastertest.csv -NoTypeInformation 
remove-item inactiveicmaster.csv 
import-csv inactiveicmastertest.csv|sort StudentDistrictID|export-csv InactiveICMaster.csv -NoTypeInformation 
remove-item InactiveICMasterTest.csv 
0

私は、これは古いです知っているが、この解決策を探して他人のために答えることを望んでいました。私はCompare-Objectを自分自身で使用しようとしています。なぜなら2つの行列が問題にぶつかっています。

上記のソリューションでは、この目的のためにループをネストするときにブレークを使用することを検討してください。はるかに速く比較することができます。ブレークは2番目のfor-eachループを停止して次のアイテムに移動するよう指示します。

申し訳ありません、ここに最初に投稿しています。どのようにフォーマットするのかわからず、私は行動に戻る必要があります。

関連する問題