4

建築やデザインに関連する質問だと思います。

私のシーンリオは

「」

  • 大量のデータをDbからCSVにエクスポートします。
  • 私は定期的にそれをします。
  • 最後にエクスポートされたCSVデータが前にエクスポートされたデータの内容と異なるかどうかを確認したい」

どうすればこれを達成できますか(ループして行ごとに比較する必要はありません)?

  • 私のエクスポーターは.Netコンソールアプリケーションです。

  • 私のDbはMS-SQLです(知る必要がある場合)

  • 私のエクスポーターは、PowerShellスクリプト内でスケジュールされたタスクとして定期的に実行されます

4

3 に答える 3

6

比較する各CSVファイルのチェックサムを生成したいようです。
ファイルのMD5チェックサムを計算する

using (var md5 = MD5.Create())
{
    using (var stream = File.OpenRead(filename))
    {
        return md5.ComputeHash(stream);
    }
}
于 2012-11-08T14:09:46.750 に答える
1

データベースに最後に変更された時刻を追跡させることができます。そのテーブルにトリガーを追加するだけで、アイテムが追加/削除/更新されるたびに、特定の値を現在の時刻に設定できます。そうすれば、そもそも大きなファイルを比較する必要はありません。エクスポートジョブは、最終変更時刻をクエリし、ファイルシステム上のファイルの最終変更時刻と比較して、更新する必要があるかどうかを判断するだけです。

于 2012-11-08T14:38:35.567 に答える
0

(これは、Powershellで実行していることを前提としていますが、これらの手法はすべての言語に適用されます。)

最初にファイルサイズを確認することをお勧めします。

最初にこれを行ってください、それは速いです!

if ((gci $file1).Length -ne (gci $file2).Length)
{
    Write-Host "Files are different!"
}
else
{
    # Same size, so compare contents...
}

最後に、本格的な比較を行うことができます。PowerShellを使用している場合は、Compare-Object(エイリアスdiff)を確認してください。例えば、

if (diff (gc $file1) (gc $file2))
{
    Write-Host "Files are different!"
}

http://keestalkstech.blogspot.com/2010/11/comparing-two-files-in-powershell.htmlに示すように、バッファリングされたバイト間の比較を行う方が速い場合があります。

代替案:

MD5の比較は、実際にはバイト間の比較よりも遅い場合があります。ファイルを読み込む必要があるだけでなく、ハッシュを取得するために計算を実行する必要もあります。少なくとも、古いファイルのハッシュをキャッシュすることで最適化できます。つまり、I/Oを半分に節約できます。

データベーステーブルをエクスポートしているため、ほとんどのデータベースは最後に行を追加します。これがあなたのケースであり、単に追加していて更新していないことを確認する必要があります。その場合は、ファイルの最後の行を比較するだけです。たとえば、最後の4K、または行サイズがどれだけ大きいか。

于 2012-11-09T00:53:56.360 に答える