2017-08-19 2 views
0

Ich habe versucht, wie folgt aus:Wie kopiere ich Daten aus der CSV-Datei in SQL?

public Datatable GetDatatable(){ 
     string[] [email protected]"1,ABC,Arun,12/12/2017\n 
     2,BCD,Sam,10/12/2017\n 
     3,XYZ,Ammy,11/12/2017\n 
     4,PQR,Varun,9/12/2017\n"; 
     DataTable table = new DataTable(); 
     table.Columns.Add("Dosage", typeof(int)); 
     table.Columns.Add("Drug", typeof(string)); 
     table.Columns.Add("Patient", typeof(string)); 
     table.Columns.Add("Date", typeof(DateTime)); 

     foreach (var line in csv) 
     { 
       string[] l=line.split(','); 
       table.Rows.Add(l[0]); 
       table.Rows.Add(l[1]); 
       table.Rows.Add(l[2]); 
       table.Rows.Add(l[3]); 
     } 
     return table; 
    } 

csv wie

1,ABC,Arun,12/12/2017 
2,BCD,Sam,10/12/2017 
3,XYZ,Ammy,11/12/2017 
4,PQR,Varun,9/12/2017 

Es wird unter Verwendung von foreach getan. Ich möchte das gleiche Ergebnis ohne Verwendung der for-Schleife oder foreach, weil CSV über 3 Millionen Zeilen enthalten. Bitte geben Sie einige Ideen oder Vorschläge.

+0

Dieser Code wird nicht einmal kompiliert. Können Sie ein [mcve] bereitstellen? In jedem Fall wird irgendwo eine Schleife benötigt. – Steve

+0

Was ist der Grund dafür, keine foreach-Schleife verwenden zu wollen? Irgendeine Art von Looping wird in jedem Fall notwendig sein. –

+1

Du kannst es nicht tun. Wie auch immer Sie oder einige Bibliotheken, die Sie verwenden werden, müssen Zeile für Zeile csv-Datei – Fabio

Antwort

1

Auf die eine oder andere Weise wird immer eine Schleife ausgeführt, um die Datei zu lesen, die Zeile zu teilen und sie in die DataTable einzufügen.
Es gibt viele freie Bibliotheken, um mit CSV-Dateien zu arbeiten, und wenn Sie eine einfache Suche ausführen, werden Sie sie wirklich leicht finden.

Aber Ihr Code könnte verbessert werden (und behoben) mit der Aufspaltung der Zeile nur einmal und nicht 4 mal in dieser Schleife und Hinzufügen der Zeile mit nur einer einzigen Zeile (Eigentlich fügt Ihr Code 4 Zeilen für jede Zeile und dies scheint ziemlich falsch)

foreach (var line in csv) 
{ 
    string[] parts = line.Split(','); 
    table.Rows.Add(parts); 
} 
return table; 

Wenn dies für Ihre Anforderungen ausreichen wird, liegt es an Ihnen zu bewerten. Mit so vielen Zeilen zum Lesen würde ich einen ausführlichen Vergleich der Merkmale und Leistungen verschiedener Ansätze machen. (Verwendung von Bibliotheken oder Eigenbau-Code)

1

Dies ist keine Notwendigkeit, arbeiten kann gehen für die Nutzung durch Dritte SQLBulk Copy Stattdessen

public static void BulInsert() 
    { 
     var destination = @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = SampleDatabase; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; "; // your comnnection string 

     var filename = @"d:\db.csv";//your source file 
     var connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=No;FMT=Delimited""", Path.GetDirectoryName(filename)); 
     string query = string.Format("Select * from [{0}]", Path.GetFileName(filename)); 
     using (var conn = new OleDbConnection(connString)) 
     { 
      conn.Open(); 

      OleDbCommand command = new OleDbCommand(query, conn); 
      var reader = command.ExecuteReader(); 
      using (SqlConnection destConnection = new SqlConnection(destination)) 
      { 
       try 
       { 
        destConnection.Open(); 
        using (SqlBulkCopy bulkCopy = 
         new SqlBulkCopy(destConnection)) 
        { 

         // what ever mapping with ordinal 
         bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(0, "Id")); 
         bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(1, "name")); 
         bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(2, "visit")); 
         bulkCopy.DestinationTableName = 
          "dbo.Patients"; 

         try 
         { 
          bulkCopy.WriteToServer(reader); 
         } 
         catch (Exception ex) 
         { 
          Console.WriteLine(ex.Message); 
         } 
         finally 
         { 

          reader.Close(); 
         } 
        } 
       } 
       catch (Exception) 
       { 

       } 

      } 
     } 

    } 
0

Sie Cinchoo ETL Bibliothek verwenden, wenn Sie CSV-Datentabelle konvertiert werden soll oder Massenimport CSV auf sqlserver leicht.

Um CSV-Datentabelle zu konvertieren, zeigt der folgende Code, wie es

using (var p = new ChoCSVReader("emp.csv").WithFirstLineHeader()) 
{ 
    DataTable dt = p.AsDataTable(); 
} 

tun Wenn Sie Bulk-Import CSV Sqlserver möchten, können Sie diese Codeproject Artikel auf, wie es zu tun beziehen.

Cinchoo ETL - Bulk Insert CSV File into SQLServer

Hoffnung, das hilft.

Haftungsausschluss: Ich bin der Autor dieser Bibliothek.

Verwandte Themen