2012-10-08 64 views
1

我正在將地理編碼數據從csv文件導入到我們的數據庫。在批量導入數據庫期間處理csv中的empy字段

我用下面的庫 A fast csv reader讀取CSV,然後使用SqlBulkCopy

下面是我在導入數據的一個例子

"AB10","1BH","L",0,0,,,20 
"AB10","1BR","L",39320,80570,57.14214,-2.11400,21 

它可以在良好的數據,但就ok了第一行它會拋出一個異常,因爲數據庫設置爲不接受空值。

有沒有辦法讓bulkcopy忽略不良數據?我試圖讓csv閱讀器通過使用庫的內置屬性來忽略壞行,但它們似乎不起作用。

csv.SkipEmptyLines = true; 
csv.MissingFieldAction = MissingFieldAction.ParseError; 
csv.DefaultParseErrorAction = ParseErrorAction.AdvanceToNextLine; 

我想另一種選擇是預先解析csv並刪除所有違規的行。也許有一個更好的csv庫在那裏爲.net?

感謝您的任何幫助。

回答

0

爲了對付我最後一次解析CSV到一個DataTable對象1000個條目,然後導入它們,因爲我去的空條目。

0

我使用Microsoft Text Driver來導入項目的CSV信息。它工作得很好。我定義了一個Schema.ini文件來指定列標題,數據類型,要掃描的行數(MaxScanRows = 0,將掃描整個文件)。

我還沒有試過這個,但是當你使用微軟文本驅動你發出一個選擇查詢來從csv文件中提取數據時,我想知道你是否可以添加條件來過濾出空記錄。

How to populate IDataReader from .csv for use with SqlBulkCopy.WriteToServer(IDataReader)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms709353(v=vs.85).aspx

http://www.connectionstrings.com/textfile

希望這有助於。

1

如果您可以發佈您的csv閱讀器代碼,那麼我們可以提供更多幫助。但看看你的鏈接頁面上的代碼,你可以這樣做:

while (csv.ReadNextRecord()) 
    { 
     for (int i = 0; i < fieldCount; i++) 
      Console.Write(string.Format("{0} = {1};", 
          headers[i], 
          csv[i] ?? "null")); 
     Console.WriteLine(); 
    } 

看看我在哪裏添加了空合併運算符?這應該你的輸出改變來自:

"AB10","1BH","L",0,0,,,20 

"AB10","1BH","L",0,0,null,null,20 
+0

我已經通過將csv類的數據解析爲DataTable類並對這些值進行了一些數據驗證。直接保存DataTable。它工作得很好,而且速度非常快,但如果csv庫直接支持它,它會很好,所以我通過電子郵件向作者詢問了它。 – Neil