2013-08-19 70 views
7

我想將大約1 gig的巨大.csv文件導入數據庫。如何將巨大的.csv導入到sql數據庫中?

我的應用程序在visual studio 2010中用c#編碼。它在本地運行,不需要在網絡上使用。

我嘗試使用sql compact工具箱腳本導入只有25mb導致在Visual Studio中崩潰。

我嘗試使用stringbuilder會導致內存不足異常(使用大約4 G內存!),然後失敗。

我嘗試將這些文件導入Excel或Access,然後將它們轉換爲數據庫也失敗。

哪個數據庫可以更好地處理我的問題?

  • 的SQL Express
  • SQL精簡
  • 本地SQL Server數據庫

此外,我應該用盡可能快,我可以更快地加載到一個DataGridView導入哪些方法?

感謝您的任何幫助。

+1

您是否正在編寫** SQL **(結構化查詢語言),並且真正意味着Microsoft ** SQL Server **(實際產品)呢?如果不是:**數據庫系統是用來做什麼的? –

+0

將「巨大的」csv文件分成更小的片段? – Bastardo

回答

1

SQL Express和標準SQL Server都是您存儲的理想選擇。至於用什麼來導入數據,請使用SSIS。在SQL Express或Standard SQL Server實例上創建數據庫後,右鍵單擊該數據庫,在Tasks菜單項下,您將看到Import Data的選項。它會引導您選擇數據源,在您的情況下選擇Excel,然後將其導入到數據庫中。

然後可以保存此腳本,在此過程結束時。

+0

@解決方案:嗨,感謝您的回覆,但是excel對導入數據有限制。如果你導入200MB到Excel中,它會導致崩潰! –

+0

@SmartMan,你不是說你有一個Excel電子表格要導入**到SQL Server嗎?或者,讓我們這樣說吧,您會在導入期間選擇適當的數據源。你可以選擇一個文本文件,因爲它是用逗號分隔的。 –

+1

@TheSolution:他實際上說他有一個.CSV文件;-) – HardCode

6

如果CSV文件沒有包含逗號的任何字符串,則可以直接從SQL執行BULK INSERT(如果有,則必須首先將分隔符更改爲像條(|)字符之類的內容。將數據從平面文件導入數據庫的最直接方式,並且不需要像SSIS或Excel這樣的任何中間程序。

我經常使用它,它是將數據導入SQL的最快和最有效的方式從你的命令看起來就像

BULK INSERT MyDatabase.dbo.MyTable 
     FROM MyFileName 
      DATAFILETYPE='char', 
      FIELDTERMINATOR=',', 
      BATCHSIZE=10000 

T他最常見的策略是將數據加載到工作表中,進行必要的清理/轉換,然後將其插入到實際的目標表中。

+0

SQL CE沒有'BULK INSERT'命令。請參閱http://stackoverflow.com/questions/1539277/bulk-insert-in-sqlce –

+0

@Curt:非常感謝:) +1 –

+0

此外,當您想要將csv的列映射到特定的列時,此方法將不起作用目的地表。然後,您可以使用批量插入可以使用的FormatFile。但是,我發現工作太多了。 – Steam

1

您可以在C#中使用SQLBulkImporter對象。 工程就像一個魅力。

+0

你的意思是'SqlBulkCopy'? 'SqlBulkCopy'的問題是你必須首先將所有數據加載到內存中。一旦你有一個「大」的csv,正如OP提到的那樣,它可能會變得棘手。 – banging

+0

也是如此。 。 。我通常擁有的最大文件只有18000行很害羞 –

4

如果你真的想用C#實現這一點,你需要做的是逐行讀取CSV並在移動到下一個之前插入它。

我有一個類似的情況,我必須閱讀一個2GB「CSV」(選項卡分離)並加載到MSSQL中。這是我如何安裝它。

using (FileStream fs = new FileStream(@"C:\file.csv", FileMode.Open, FileAccess.Read, FileShare.None)) 
using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1252))) 
{ 
    if (sr.ReadLine() == null) //Take this out if you don't have a header 
    { 
     throw new Exception("Empty file?!"); 
    } 

    while (sr.Peek() >= 0) 
    { 
      String s = sr.ReadLine(); 

      //SPLIT 

      //INSERT SQL 
    } 
} 
+0

非常感謝:) +1 –

相關問題