我認爲這是一個架構和/或設計相關的問題:比較兩個巨大的CSV文件進行更改的最快方法是什麼?
我之情況是:
「
- 我從數據庫導出大量數據到CSV
- 我經常這樣做
- 我想檢查最後導出的CSV數據是否不同於之前導出的d的 內容ata「
我該如何做到這一點(不需要循環和逐行比較)?
注意:
我的出口是一個.NET控制檯應用程序。
我的數據庫是MS-SQL(如果你需要知道的)
我出口定期運行一個計劃任務-within PowerShell腳本
我認爲這是一個架構和/或設計相關的問題:比較兩個巨大的CSV文件進行更改的最快方法是什麼?
我之情況是:
「
我該如何做到這一點(不需要循環和逐行比較)?
注意:
我的出口是一個.NET控制檯應用程序。
我的數據庫是MS-SQL(如果你需要知道的)
我出口定期運行一個計劃任務-within PowerShell腳本
這聽起來像你只想生成每個CSV文件的校驗和來進行比較。
Calculate MD5 checksum for a file
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(stream);
}
}
我同意這個想法 - 甚至可以提前計算每個導出的校驗和 - 保持校驗和在「export_history」在數據庫中的表,所以你有每個導出的永久記錄。 –
我喜歡Export_History理念 – pencilCake
你可以讓數據庫跟蹤的最後一次修改的時間。只需在該表中添加一個觸發器,並且每當添加/刪除/更新任何項目時,都可以將特定值設置爲當前時間。然後您不需要首先比較大文件;您的導出作業可以簡單地查詢上次修改時間,將其與文件系統上最後一次修改時間進行比較,並確定是否需要更新它。
(這裏假定您在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或不管你的行大小是多少。
我正在考慮使用支票作爲一個選項... – pencilCake
你可以提出這一點的一部分你的問題,評論是沒有必要的:) –
嗯,我不想通過指出影響的意見那...也許有更好的選擇比校驗和,我不想阻止這些想法:) – pencilCake