2013-01-11 82 views
1

我正在編寫一個內部應用程序,其中一個功能是從遠程系統導入數據。來自遠程系統的數據以CSV文件的形式出現。我需要將我係統中的數據與CSV文件的數據進行比較。用c#比較CSV文件和數據庫的最快方法

我需要對我的系統進行任何更改(添加和更改)。我需要跟蹤每個已更改的字段。

我的數據庫已標準化,因此我正在處理大約10個表格以與CSV文件中的數據對應。什麼是實施這個最好的方法?每個CSV文件每天處理大約500,000條記錄。我開始通過使用查找ID從我的SQL數據庫中逐行查詢,然後使用c#根據需要做字段比較和更新或插入操作;然而,這需要太長時間。

有什麼建議嗎?

+2

將所有CSV數據插入到數據庫中,並進行表格比較或做相反的操作,將所有數據庫數據導出爲CSV並進行文件比較。 – lahsrah

+0

你有什麼作爲唯一的鑰匙嗎? –

+0

我有一個字段作爲唯一鍵。如果我試圖從數據庫中提取所有數據,大約有10個標準化的表格,則需要太多時間和內存。我想做大部分(如果不是全部)在c#代碼中的比較,因爲我想讓我的數據庫脫離它並在更新上應用特殊的業務規則。 –

回答

2

你可以做到以下幾點:

  • 加載CVS文件到臨時表在你的數據庫;
  • 對它進行驗證和清理程序(如有必要)
  • 你的實時數據進行的比較和更新
  • 消滅從臨時表

所有數據使用這種方法可以實現幾乎所有使用RDBMS功能的清理,驗證和更新邏輯。

如果您的RDBMS是SQL Server,則可以利用SQL Server Integration Services。

+0

+1使用bcp或.net庫(如http://www.csvreader.com/)將數據快速加載到登臺表中。 –

0

將第一條評論擴展到您的問題。

創建一個與您的csv文件格式相匹配的適當索引表,並將數據直接轉儲到該表中。

使存儲過程具有適當的查詢來更新/刪除/插入到活動表中。

擺脫臨時表。

2

如果您有任何作爲唯一鍵,就可以執行以下操作:

  • 創建包含一個獨特的鍵和與該鍵相關聯的所有字段的散列的新表散列(做而不是使用.NET的object.GetHashCode(),因爲返回的值確實會隨着設計而不時變化。我個人使用Google的CityHash,我將它移植到C#中)。
  • 當您得到一個新的CSV文件時,計算每個鍵的散列值
  • 檢查CSV文件中每一行的散列表。
  • 如果沒有唯一鍵的條目,則創建一個並插入該行。
  • 如果有條目,請查看哈希值是否已更改。
  • 如果有,更新哈希表中的哈希並更新數據。
相關問題