2

notepad++、powershell、Excel 2007 があります 。 database.csvimport.csvという名前の 2 つの .csv ファイルがあります。Import.csv には、データベースにオンラインで追加したい新しいエントリが含まれています。Database.csv には、そのデータベースの現在のレコードが含まれています。どちらのファイルにも、カンマと改行で区切られた単純な一意の値のリストが含まれています。

ただし、データベースには、新しいファイルにすでにいくつかのエントリが含まれている場合があります。また、新しいファイルには、データベースにないエントリが含まれています。また、データベース ファイルには、記録目的で保持されているエントリが含まれていますが、入力ファイルには含まれていません。

それらを単純に組み合わせると、継続的に存在するレコードの重複が発生します。また、データベースにのみ存在するレコードと入力ファイルにのみ存在するレコードの単一コピーも作成されます。

私が欲しいのは、入力ファイルにのみ存在するレコードのみを含むファイルです。何かアドバイス?

4

3 に答える 3

3

csv ファイルに列 a、b、および c があると仮定します。

$db = Import-Csv database.csv
$import = Import-Csv import.csv
$new = Compare-Object -ReferenceObject $db -DifferenceObject $import -Property a,b,c -PassThru | ? { $_.SideIndicator -eq "=>" } | Select a,b,c

a、b、および c を、比較する列の名前に置き換えるだけです。

于 2013-02-11T04:52:47.583 に答える
2

パワーシェル:

Get-Content <database file> -TotalCount 1 |
 Set-Content C:\somedir\ToUpload.csv


$import = @{}

Get-Content <import file> |
 select -Skip 1
 foreach {
          $import[$_] = $true
         }

Get-Content <Database file> |
select -Skip 1 |
 foreach {
           if ($import[$_])
             {
              $import[$_].remove()
             }
         }

 $import.Keys |
  Add-Content C:\Somedir\ToUpload.csv

または、両方のファイルをメモリに読み込みます。

Get-Content <database file> -TotalCount 1 |
 Set-Content C:\somedir\ToUpload.csv

$import = Get-Content <import file>
 select -Skip 1

$database = Get-Content <database file>
 select -Skip 1

$import |
 where {$database -notcontains $_} |
 Add-Content C:\somedir\ToUpload.csv

インポート/エクスポート csv を使用するソリューションは機能しますが、ファイルをテキスト データとして処理する場合と比較して、追加のメモリとプロセスのオーバーヘッドが発生します。ファイルのサイズと csv ファイル内の列の数によっては、違いが些細なことから大きなものになることもあります。私見では。

于 2013-02-11T00:36:24.063 に答える
0

Compare-Object一致する特定のプロパティがない場合、csv からインポートされた customobject で時々苦労します。

パフォーマンスが必要な場合(大きなcsvファイルの場合)、これを試すことができます:

$i = @{}
[IO.File]::ReadAllLines("C:\input.csv") | % { $i[$_] = $true }

$reader = New-Object System.IO.StreamReader "C:\db.csv"

#Skip header. This way the output file(new.csv) will get input.csv's header
$reader.ReadLine() | Out-Null

while (($line = $reader.ReadLine()) -ne $null) {
    #Remove row if it exists in db.csv
    if ($i.ContainsKey($line)) {
        $i.Remove($line)
    }
}
$reader.Close()

$i.Keys | Add-Content c:\new.csv
于 2013-02-11T08:12:10.777 に答える