2013-08-19 16 views
7

Voglio importare un enorme file .csv di circa 1 concerto nel database.come importare enormi .csv nel database sql?

La mia applicazione è codificata in C# in Visual Studio 2010. È in esecuzione a livello locale e non è necessario utilizzare in rete.

Il mio tentativo di importare solo 25mb utilizzando gli script della casella degli strumenti compatta di sql causa l'arresto anomalo in Visual Studio.

Il mio tentativo di utilizzare stringbuilder causa un'eccezione di memoria insufficiente (utilizzo di circa 4 gig di memoria!) E quindi non riesce.

Il tentativo di importare questi file in Excel o Access e di convertirli in database non funziona.

Quali di questi database possono gestire meglio per risolvere il mio problema?

  • SQL Express
  • SQL Compact
  • locale database di SQL Server

Inoltre, quale metodo devo usare per importare il più velocemente che posso e per caricare più velocemente in un datagridview?

Grazie per qualsiasi aiuto.

+1

Stai scrivendo ** SQL ** (linguaggio di query strutturato) e in realtà significa Microsoft ** SQL Server ** (il prodotto attuale) da questo? In caso contrario: ** a cosa serve il sistema di database **? –

+0

divide il file csv "enorme" in parti più piccole? – Bastardo

risposta

1

Sia SQL Express che SQL Server standard sono buoni candidati per l'archiviazione. E per quanto riguarda cosa usare per importare i dati, usa SSIS. Una volta creato il database sull'istanza SQL Express o SQL Server standard, fare clic con il tasto destro del mouse su quel database e sotto l'elemento del menu Tasks vedrai un'opzione per Import Data. Ti guiderà nella selezione di un'origine dati, nel tuo caso Excel, e poi nel importarlo nel database.

Questo script, al termine del processo, può essere salvato.

+0

@ La soluzione: salve, e grazie per la vostra risposta, ma l'Excel ha limitazioni sull'importazione dei dati. se importate 200mb in Excel, questo porta a crash! –

+0

@ SmartMan, non hai detto di avere un foglio di calcolo Excel che vuoi importare ** in ** SQL Server? Oppure, mettiamola in questo modo, dovresti scegliere l'origine dati appropriata durante l'importazione. Nel tuo caso potresti scegliere un file di testo perché è delimitato da virgole. –

+1

@ TheSolution: In realtà ha detto che ha un file .CSV ;-) – HardCode

6

Se il file CSV non ha stringhe contenenti virgole, si può fare una diretta BULK INSERT da SQL (se lo fa, si dovrà cambiare il delimitatore a qualcosa come una barra (|) personaggio, prima. Questo è il modo più diretto per ottenere dati da un file flat nel database e non richiede alcun programma intermedio come SSIS o Excel

Lo uso spesso ed è il modo più rapido ed efficiente di ottenere dati in SQL dall'esterno. Il tuo comando sarà simile a

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

T la strategia più comune è quella di caricare i dati in una tabella di lavoro, eseguire qualsiasi operazione di pulizia/conversione e quindi inserirla nella tabella di destinazione effettiva.

+0

SQL CE non ha un comando 'BULK INSERT'. Vedi http://stackoverflow.com/questions/1539277/bulk-insert-in-sqlce –

+0

@Curt: grazie mille :) +1 –

+0

Inoltre, questo metodo non funzionerà quando si desidera mappare colonne di csv a colonne specifiche di tabella di destinazione. È quindi possibile utilizzare un FormatFile che può essere utilizzato dall'inserimento di massa. Ma trovo che troppo lavoro. – Steam

1

È possibile utilizzare l'oggetto SQLBulkImporter in C#. Funziona come un fascino.

+0

Vuoi dire 'SqlBulkCopy'? Il problema con 'SqlBulkCopy' è che devi caricare prima tutti i tuoi dati in memoria. Una volta che hai un csv "grande", come cita l'OP, può diventare complicato. – banging

+0

Anche vero. . Il file più grande che ho normalmente è solo timido di 18000 righe –

4

Se si desidera ottenere ciò utilizzando C#, è necessario leggere il CSV riga per riga e inserirlo prima di passare a quello successivo.

Ho una situazione simile in cui devo leggere un "CSV" da 2 GB (scheda separata) e caricare in MSSQL. Ecco come l'ho installato.

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

Grazie mille :) +1 –

Problemi correlati