2016-04-12 30 views
0

考えると2つのCSVファイルから試合を控除:2つのCSVファイルを比較し、元

 
File1.csv 
SKU,Description,UPC 
101,Saw,101010103 
102,Drill,101010102 
103,Screw,101010101 
104,Nail,101010104 

File2.csv 
SKU,Description,UPC 
100,Light,101010105 
101,Saw,101010103 
104,Nail,101010104 
106,Battery,101010106 
108,Bucket,101010114 
私は新しいCSVファイルを作成したい

、我々はファイル1からすべてのエントリを持っているUpdatedList.csvを呼び出します。 csvは、SKUがFile1.csvとFile2.csvの両方にある行を差し引いたものです。この場合、UpdatedList.csvは

のようになります
 
UpdatedList.csv 
"SKU","Description","UPC" 
"102","Drill","101010102" 
"103","Screw","101010101" 

次のコードは私が望むことをしますが、より効率的な方法があると思います。どのように私はループなしでこれを行うことができますか?私のコードは以下の通りです。

#### Create a third file that has all elements of file 1 minus those in file 2 ### 
$FileName1 = Get-FileName "C:\LowInventory" 
$FileName2 = Get-FileName "C:\LowInventory" 
$f1 = ipcsv $FileName1 
$f2 = ipcsv $FileName2 
$f3 = ipcsv $FileName1 
For($i=0; $i -lt $f1.length; $i++){ 
For($j=0; $j -lt $f2.length; $j++){ 
if ($f1[$i].SKU -eq $f2[$j].SKU){$f3[$i].SKU = 0} 
} 
} 
$f3 | Where-Object {$_.SKU -ne "0"} | epcsv "C:\LowInventory\UpdatedList.csv" -NoTypeInformation 
Invoke-Item "C:\LowInventory\UpdatedList.csv" 
################################ 
あなたはグループ-Objectコマンドレットを利用することによって、ループせずにこれを行うことができます

答えて

1

$f1 = ipcsv File1.csv; 
$f2 = ipcsv File2.csv; 
$f1.ForEach({Add-Member -InputObject $_ 'X' 0}) # So we can select these after 
$f1 + $f2     | # merge our lists 
    group SKU    | # group by SKU 
    where {$_.Count -eq 1} | # select ones with unique SKU 
    select -expand Group | # ungroup 
    where {$_.X -eq 0}  # where from file1 
関連する問題