CSV-Datei in SQL Server importieren

Ich bin auf der Suche nach Hilfe beim Importieren einer .csv-Datei in SQL Server unter Verwendung von "BULK INSERT" und habe einige grundlegende Fragen.

Probleme:

  1. Die Daten der CSV-Datei können , (Komma) dazwischen haben (z.B. Beschreibung), wie kann ich also den Import mit diesen Daten durchführen?

  2. Wenn der Kunde die CSV-Datei mit Excel erstellt, werden die Daten mit Kommas in Anführungszeichen gesetzt (wie im folgenden Beispiel). Wie kann der Import damit umgehen?

  3. Wie können wir feststellen, ob einige Zeilen fehlerhafte Daten enthalten, die der Import überspringt? (überspringt der Import Zeilen, die nicht importierbar sind)

Hier ist die Beispiel-CSV mit Kopfzeile:

Name,Class,Subject,ExamDate,Mark,Description
Prabhat,4,Math,2/10/2013,25,Test data for prabhat.
Murari,5,Science,2/11/2013,24,"Test data for his's test, where we can test 2nd ROW, Test."
sanjay,4,Science,,25,Test Only.

Und SQL-Anweisung zum Importieren:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)
Lösung

Basierend auf SQL Server CSV-Import

  1. Die Daten der CSV-Datei können , (Komma) dazwischen haben (Bsp:

    Beschreibung), so wie kann ich den Import mit diesen Daten?

Lösung

Wenn Sie , (Komma) als Trennzeichen verwenden, gibt es keine Möglichkeit, zwischen einem Komma als Feldbegrenzer und einem Komma in Ihren Daten zu unterscheiden. Ich würde einen anderen FIELDTERMINATOR wie || verwenden. Der Code würde dann so aussehen, dass er Komma und einfachen Schrägstrich perfekt behandelt.

  1. Wenn der Kunde die CSV-Datei aus Excel erstellt, werden die Daten, die ein

    Komma haben, werden in " ... " (doppelte Anführungszeichen) eingeschlossen [wie das folgende Beispiel] so wie der Import kann dies behandeln?

Lösung

Wenn Sie BULK insert verwenden, gibt es keine Möglichkeit, doppelte Anführungszeichen zu behandeln, die Daten werden Daten mit doppelten Anführungszeichen in die Zeilen eingefügt. Nach dem Einfügen der Daten in die Tabelle können Sie diese doppelten Anführungszeichen durch '` `' ersetzen.

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
  1. Wie können wir feststellen, ob einige Zeilen schlechte Daten haben, die der Import überspringt? (überspringt der Import Zeilen, die nicht importierbar sind)?

Lösung

Um Zeilen zu behandeln, die nicht in die Tabelle geladen werden, weil sie ungültige Daten oder ein ungültiges Format haben, könnte man mit der ERRORFILE-Eigenschaft behandeln, den Namen der Fehlerdatei angeben und die fehlerhaften Zeilen in die Fehlerdatei schreiben. Zeilen, die einen Fehler haben, in die Fehlerdatei schreiben. Der Code sollte wie folgt aussehen.

BULK INSERT SchoolsTemp
    FROM 'C:\CSVData\Schools.csv'
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    ERRORFILE = 'C:\CSVDATA\SchoolsErrorRows.csv',
    TABLOCK
    )
Kommentare (5)

Der beste, schnellste und einfachste Weg, um das Problem mit dem Komma in den Daten zu lösen, ist die Verwendung von Excel, um eine kommagetrennte Datei zu speichern, nachdem Sie die Windows-Einstellung für das Listentrennzeichen auf etwas anderes als ein Komma (z. B. eine Pipe) gesetzt haben. Dadurch wird eine durch Pipe (oder was auch immer) getrennte Datei erzeugt, die Sie dann importieren können. Dies ist hier beschrieben.

Kommentare (0)

Zunächst müssen Sie die CSV-Datei in die Datentabelle importieren

Dann können Sie mit SQLBulkCopy Massenzeilen einfügen

using System;
using System.Data;
using System.Data.SqlClient;

namespace SqlBulkInsertExample
{
    class Program
    {
      static void Main(string[] args)
        {
            DataTable prodSalesData = new DataTable("ProductSalesData");

            // Create Column 1: SaleDate
            DataColumn dateColumn = new DataColumn();
            dateColumn.DataType = Type.GetType("System.DateTime");
            dateColumn.ColumnName = "SaleDate";

            // Create Column 2: ProductName
            DataColumn productNameColumn = new DataColumn();
            productNameColumn.ColumnName = "ProductName";

            // Create Column 3: TotalSales
            DataColumn totalSalesColumn = new DataColumn();
            totalSalesColumn.DataType = Type.GetType("System.Int32");
            totalSalesColumn.ColumnName = "TotalSales";

            // Add the columns to the ProductSalesData DataTable
            prodSalesData.Columns.Add(dateColumn);
            prodSalesData.Columns.Add(productNameColumn);
            prodSalesData.Columns.Add(totalSalesColumn);

            // Let's populate the datatable with our stats.
            // You can add as many rows as you want here!

            // Create a new row
            DataRow dailyProductSalesRow = prodSalesData.NewRow();
            dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
            dailyProductSalesRow["ProductName"] = "Nike";
            dailyProductSalesRow["TotalSales"] = 10;

            // Add the row to the ProductSalesData DataTable
            prodSalesData.Rows.Add(dailyProductSalesRow);

            // Copy the DataTable to SQL Server using SqlBulkCopy
            using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
            {
                dbConnection.Open();
                using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                {
                    s.DestinationTableName = prodSalesData.TableName;

                    foreach (var column in prodSalesData.Columns)
                        s.ColumnMappings.Add(column.ToString(), column.ToString());

                    s.WriteToServer(prodSalesData);
                }
            }
        }
    }
}
Kommentare (1)