2012-09-12 66 views
2

我知道圍繞這個主題還有其他線索,但它們並不像我的需求那樣具體(我迄今可以找到)。在導入到SQL Server之前驗證CSV文件

我有用於導入到我管理的SQL Server數據庫的csv文件。它們被人類放在一起,因此可能會出現錯誤,如太多的列,錯誤的數據類型,損壞的標題等等。

我有一個網頁表單,可以接收用戶的文件到服務器上的一個目錄,然後它讀取一個字符串作爲一個字符串,解析它逐個單元格,並執行諸如檢查正確的單元格計數存在,然後移動到下一行。

現在驗證數據類型和範圍,我不清楚最佳的方法。做數字類型的手動範圍檢查等操作看起來有點過時。

有沒有更好的方法?一些東西;

  1. 我有SQL Server類型,如「數字」,但也nvarchar。

  2. 這些文件可以小到幾千字節或大到超過千兆字節。

  3. 我需要報告存在錯誤的每個特定行和列,而不僅僅是行x失敗。

我想,也許嘗試轉換/施放單元格的值到預期的類型,捕獲異常和數據分割成塊,並生成線程做並行檢查?

在此先感謝。

+0

如果你的數據存儲是SQL Server,我覺得你應該SSIS。創建一個SSIS包並嘗試使用C#執行SSIS包http://www.codeproject.com/Articles/28096/Excecute-SSIS-package-DTSX-from-ASP-Net這將負責將列映射到特定數據類型。 –

+0

網站MVC3?如果是這樣,請查看模型/視圖模型和數據/驗證註釋。然後,您可以創建一個新的ObjectX,從CSV行填充它並驗證它 - 找出行(整個對象)和屬性是否有效,並相應地報告並保存(如果適用)。 – BlueChippy

+0

這只是一個標準的ASP.Net C#Web應用程序。我希望在webapp本身中保留驗證,這樣我就不會受到數據庫中斷和/或維護窗口的阻礙。在C#代碼中有更好的方法嗎? – flipcode

回答

1

我建議使用bulc copy。 SSIS要複雜得多,容易出錯(在正常情況下也要慢得多......)。

通常情況下,您會知道您希望使用哪些列,並且希望爲導入的數據創建具有正確格式的「導入階段表」。如果它不符合TSQL中的最低要求(列計數)(圍繞bulc插件使用「try/catch」),則可以拒絕整個文件。

轉換和類型檢查可以在初始導入後完成。爲此,在舞臺表格中增加具有正確格式的列可能會很有用。例如。您可以導入到nvarchar列並轉換爲十進制值。這裏的技巧是使用一個觀點:在下面的意見「myImportTable_InsertView」的excample從舞臺表只選擇進口列(階段表具有類型檢查的詳細列)

DECLARE @SQLString nvarchar(4000) = 

    INSERT dbo.myImportTable_InsertView 
    FROM ''' + @FullFilename + ''' WITH 
    (
    FIELDTERMINATOR = '';'', 
    ROWTERMINATOR = ''\n'', 
    CODEPAGE= ''RAW'' 
    )' 
    Exec (@SQLString) 

完成所有驗證後你將只需將舞臺表中的數據複製到最終目的地即可。

要報告錯誤的行,我通常在舞臺表格的行上使用標誌來標記不同類型的錯誤。