2013-08-19 14 views
7

Chcę zaimportować ogromny plik .csv około 1 gig do bazy danych.jak zaimportować ogromne .csv do bazy danych sql?

Moja aplikacja jest kodowana w C# w visual studio 2010. Działa lokalnie i nie musi być używana w sieci.

Moja próba importu tylko 25 MB przy użyciu skryptów skrytki narzędziowej sql prowadzi do awarii w Visual Studio.

Moja próba użycia stringbuilder prowadzi do wyjątku braku pamięci (użycie około 4 GB pamięci!), A następnie kończy się niepowodzeniem.

Moja próba importu tych plików do programu Excel lub Access, a następnie przekonwertowania ich na bazę danych również się nie powiedzie.

Które z tych baz danych radzą sobie lepiej w celu rozwiązania mojego problemu?

  • SQL Express
  • SQL Compact
  • lokalna baza danych SQL Server

Ponadto, której metody należy użyć do zaimportowania go tak szybko, jak tylko mogę i załadować je szybciej w DataGridView?

Dzięki za pomoc.

+1

Czy piszesz ** SQL ** (uporządkowany język zapytań) i naprawdę oznacza to Microsoft ** SQL Server ** (rzeczywisty produkt)? Jeśli nie: ** jaki jest ** system baz danych? –

+0

podzielić "ogromny" plik CSV na mniejsze kawałki? – Bastardo

Odpowiedz

1

Zarówno SQL Express, jak i standardowy serwer SQL są dobrymi kandydatami do przechowywania. A jeśli chodzi o to, czego użyć do importowania danych, skorzystaj z SSIS. Po utworzeniu bazy danych w SQL Express lub standardowym wystąpieniu SQL Server kliknij prawym przyciskiem myszy na tę bazę danych, a pod pozycją menu Tasks zobaczysz opcję dla Import Data. Przeprowadzi Cię przez wybór źródła danych, w twoim przypadku Excela, a następnie zaimportowanie go do bazy danych.

Skrypt ten na końcu procesu można zapisać.

+0

@ Rozwiązanie: cześć, i dziękuję za odpowiedź, ale program Excel ma ograniczenia w zakresie importowania danych. jeśli zaimportujesz 200 MB do programu Excel, spowoduje to awarię! –

+0

@SmartMan, czy nie powiedziałeś, że masz arkusz kalkulacyjny Excel, który chcesz zaimportować ** do ** SQL Server? Lub, powiedzmy to w ten sposób, wybrałbyś odpowiednie źródło danych podczas importu. W twoim przypadku możesz wybrać plik tekstowy, ponieważ jest rozdzielany przecinkami. –

+1

@TheSolution: Powiedział, że ma plik .CSV ;-) – HardCode

6

Jeśli plik CSV nie ma żadnych ciągów znaków zawierających przecinki, można wykonać bezpośredni kod BULK INSERT z SQL (jeśli tak, trzeba najpierw zmienić ogranicznik na znak podobny do paska (|). najbardziej bezpośredni sposób pobierania danych z płaskiego pliku do bazy danych i nie wymaga żadnych programów pośrednich, takich jak SSIS lub Excel

Używam go często i jest to najszybszy i najbardziej efektywny sposób na uzyskanie danych na SQL z zewnątrz. Twoje polecenie będzie wyglądać podobnie jak:

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

T najczęściej stosowaną strategią jest ładowanie danych do roboczej tabeli, czyszczenie i konwersja są konieczne, a następnie wstawianie do rzeczywistej tabeli docelowej.

+0

SQL CE nie ma komendy 'BULK INSERT'. Zobacz http://stackoverflow.com/questions/1539277/bulk-insert-in-sqlce –

+0

@Curt: wielkie dzięki :) +1 –

+0

Ta metoda nie będzie działać, jeśli chcesz zmapować kolumny csv do konkretnych kolumn tabela docelowa. Następnie można użyć pliku FormatFile, którego może używać wstawka zbiorcza. Ale uważam, że za dużo pracy. – Steam

1

Możesz użyć obiektu SQLBulkImporter w języku C#. Działa jak urok.

+0

Masz na myśli 'SqlBulkCopy'? Problem z 'SqlBulkCopy' polega na tym, że najpierw musisz załadować wszystkie swoje dane do pamięci. Kiedy już będziesz miał "duży" csv, jak wspomina OP, może to być trudne. – banging

+0

Również prawdziwe. . Największy plik, jaki zwykle mam, to po prostu nieśmiały 18000 wierszy –

4

Jeśli naprawdę chcesz osiągnąć to za pomocą C#, musisz przeczytać CSV wiersz po wierszu i wstawić go przed przejściem do następnego.

Mam podobną sytuację, w której muszę odczytać 2 GB "CSV" (oddzielona tabulatorami) i załadować do MSSQL. Oto, jak mam to skonfigurować.

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

Dziękuję bardzo :) +1 –

Powiązane problemy