2017-09-06 15 views
0

CSVファイル(ヘッダー付き)に品揃えデータが格納されています。ファイルは毎日更新されます。私はそれらのファイル(古いものと新しいもの)の違いを見つけて、それらを別々のファイルに抽出する必要があります。CSVファイルの差分を別々のファイルに抽出する

たとえば、古いファイルでは「18,50」の価格があり、現在は「17,90」の更新されたものです。スクリプトはこの行を新しいファイルに抽出するはずです。

これまでのところ、両方のCSVファイルを(Import-Csv経由で)インポートできましたが、私の現在の解決策は各行をfindstrで比較することです。

問題は、次のとおりです。

  • 9 10の例では、文字列は、比較するには長すぎます。
  • 新しい行が挿入される場合はどうなりますか?ファイルの最後に行が挿入されていない場合、比較はもう機能しません。

私の現在のコードは次のとおりです。

foreach ($oldData in (Import-Csv $PSScriptRoot\old.csv -Delimiter ";" -Encoding "default")) { 
    foreach ($newData in (Import-Csv $PSScriptRoot\new.csv -Delimiter ";" -Encoding "default")) { 
     findstr.exe /v /c:$oldData $newData > $PSScriptRoot\diff.txt 
    } 
} 
+1

あなたが試したことを示してください。 – ArcSet

+1

そしていくつかのサンプルデータ。すなわち、識別カラム(製品番号など)はありますか? –

+0

はい固有の製品IDである「idArtikel」と呼ばれる識別カラム – Razorfen

答えて

1

別々の変数に両方のファイルを読み、比較のためにCompare-Objectを使用します。Joinの詳細については

$fields = 'idArtikel', 'Preis', ... 

$csv1 = Import-Csv $PSScriptRoot\old.csv -Delimiter ';' 
$csv2 = Import-Csv $PSScriptRoot\new.csv -Delimiter ';' 

Compare-Object -ReferenceObject $csv1 -DifferenceObject $csv2 -Property $fields -PassThru | Where-Object { 
    $_.SideIndicator -eq '=>' 
} | Select-Object $fields | Export-Csv 'C:\path\to\diff.csv' -Delimiter ';' 
+0

ありがとうございました - このスニペットは完璧に動作します! – Razorfen

関連する問題