2012-11-08 26 views
4

我認爲這是一個架構和/或設計相關的問題:比較兩個巨大的CSV文件進行更改的最快方法是什麼?

我之情況是

  • 我從數據庫導出大量數據到CSV
  • 我經常這樣做
  • 我想檢查最後導出的CSV數據是否不同於之前導出的d的 內容ata「

我該如何做到這一點(不需要循環和逐行比較)?

注意

  • 我的出口是一個.NET控制檯應用程序。

  • 我的數據庫是MS-SQL(如果你需要知道的)

  • 我出口定期運行一個計劃任務-within PowerShell腳本

+0

我正在考慮使用支票作爲一個選項... – pencilCake

+2

你可以提出這一點的一部分你的問題,評論是沒有必要的:) –

+0

嗯,我不想通過指出影響的意見那...也許有更好的選擇比校驗和,我不想阻止這些想法:) – pencilCake

回答

6

這聽起來像你只想生成每個CSV文件的校驗和來進行比較。
Calculate MD5 checksum for a file

using (var md5 = MD5.Create()) 
{ 
    using (var stream = File.OpenRead(filename)) 
    { 
     return md5.ComputeHash(stream); 
    } 
} 
+4

我同意這個想法 - 甚至可以提前計算每個導出的校驗和 - 保持校驗和在「export_history」在數據庫中的表,所以你有每個導出的永久記錄。 –

+1

我喜歡Export_History理念 – pencilCake

1

你可以讓數據庫跟蹤的最後一次修改的時間。只需在該表中添加一個觸發器,並且每當添加/刪除/更新任何項目時,都可以將特定值設置爲當前時間。然後您不需要首先比較大文件;您的導出作業可以簡單地查詢上次修改時間,將其與文件系統上最後一次修改時間進行比較,並確定是否需要更新它。

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或不管你的行大小是多少。

相關問題