CSV-Datei in SQL Server importieren

185

Ich suche Hilfe beim Importieren einer .csvDatei in SQL Server mit BULK INSERTund habe einige grundlegende Fragen.

Probleme:

  1. Die CSV-Dateidaten können ,(Komma) dazwischen haben (Beispiel: Beschreibung). Wie kann ich also den Import für diese Daten durchführen?

  2. Wenn der Client die CSV aus Excel erstellt, werden die Daten mit Komma eingeschlossen ""(doppelte Anführungszeichen) [wie im folgenden Beispiel]. Wie kann der Import damit umgehen?

  3. Wie verfolgen wir, ob einige Zeilen fehlerhafte Daten enthalten, die importiert werden? (Überspringt beim Importieren Zeilen, die nicht importierbar sind)

Hier ist die Beispiel-CSV mit Header:

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 zu importierende SQL-Anweisung:

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
)
Prabhat
quelle
Kann sein , SSMS: Wie importieren (Kopieren / Einfügen) Daten aus Excel helfen können (wenn Sie nicht verwenden wollen BULK NSERTfür sie oder haben keine Berechtigungen).
Denis

Antworten:

169

Basierter SQL Server CSV-Import

1) Die CSV-Dateidaten können ,(Komma) dazwischen haben (Beispiel: Beschreibung). Wie kann ich also den Import für diese Daten durchführen?

Lösung

Wenn Sie ,(Komma) als Trennzeichen verwenden, können Sie in Ihren Daten nicht zwischen einem Komma als Feldterminator und einem Komma unterscheiden. Ich würde ein anderes FIELDTERMINATORwie verwenden ||. Code würde so aussehen und dies wird Komma und einzelnen Schrägstrich perfekt verarbeiten.

2) Wenn der Client die CSV aus Excel erstellt, werden die Daten mit Komma eingeschlossen " ... "(doppelte Anführungszeichen) [wie im folgenden Beispiel]. Wie kann der Import damit umgehen?

Lösung

Wenn Sie BULK insert verwenden, gibt es keine Möglichkeit, doppelte Anführungszeichen zu verarbeiten. Daten werden mit doppelten Anführungszeichen in 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,'"','')

3) Wie verfolgen wir, ob einige Zeilen fehlerhafte Daten enthalten, die importiert werden? (Überspringt der Import Zeilen, die nicht importierbar sind)?

Lösung

Um Zeilen zu verarbeiten, die aufgrund ungültiger Daten oder ungültiger Formate nicht in die Tabelle geladen wurden, können Sie die ERRORFILE-Eigenschaft verwenden. Geben Sie den Namen der Fehlerdatei an. Die fehlerhaften Zeilen werden in die Fehlerdatei geschrieben . Code sollte so 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
    )
Vishwanath Dalvi
quelle
1
Danke für die Hilfe. Reg die Lösung # 1: Können wir || erstellen Wertedatei von Excel getrennt? Weil rund 20% der Quelldateien vom Client mit Excel erstellt werden.
Prabhat
@Prabhat Wie laden Sie Excel-Dateien in SQL Server?
Vishwanath Dalvi
Dies sind keine Excel-Dateien, die ich lade. Der Client verwendet Excel zum Erstellen von CSV-Dateien (für 20% der Quelldaten, die unsere Anwendung importiert). Und ich habe gefragt, ob wir CSV-Dateien mit Excel erstellen, wie können wir || haben als Spaltenwerttrennzeichen?
Prabhat
Wenn Sie Einfluss darauf haben, wie der Client CSV-Dateien aus Excel erstellt, können Sie ihm beibringen, wie das Trennzeichen in Excel festgelegt wird (und es handelt sich nicht mehr um eine durch Kommas getrennte Datei, sondern um eine durch Pipe (|) getrennte Datei. Zum Beispiel. Angesichts der Rahmen, durch die Sie springen, und wenn Sie über SSIS verfügen, empfehle ich Ihnen, dies zu überprüfen. Versionen von SQL Server 2012 und höher verfügen über einen sehr robusten SSIS-Designer (auch in VS 2012 und höher) Ermöglichen Sie Ihrem Client, Ihnen einfach die Excel-Dateien anstelle von
CSV
Ich bin mir nicht sicher, ob das ganz richtig ist. Sie können mit doppelten Anführungszeichen in SQL Bulk Insert umgehen. Es gibt einen Stapelüberlauf zu diesem Thema und man kann Formatdateien verwenden, um Bulk Insert verschiedene Deliminatoren beizubringen. stackoverflow.com/questions/25726385/… advancesharp.com/blog/1083/…
DtechNet
33

Sie müssen zuerst eine Tabelle in Ihrer Datenbank erstellen, in die Sie die CSV-Datei importieren. Führen Sie nach dem Erstellen der Tabelle die folgenden Schritte aus.

• Melden Sie sich mit SQL Server Management Studio bei Ihrer Datenbank an

• Klicken Sie mit der rechten Maustaste auf Ihre Datenbank und wählen Sie Tasks -> Import Data...

• Drücke den Next > Schaltfläche

• Wählen Sie als Datenquelle aus Flat File Source. Verwenden Sie dann die Schaltfläche Durchsuchen, um die CSV-Datei auszuwählen. Nehmen Sie sich etwas Zeit, um zu konfigurieren, wie die Daten importiert werden sollen, bevor Sie auf klickenNext > Schaltfläche .

• Wählen Sie als Ziel den richtigen Datenbankanbieter aus (z. B. für SQL Server 2012 können Sie SQL Server Native Client 11.0 verwenden). Geben Sie den Servernamen ein. Überprüfen Sie das Use SQL Server AuthenticationOptionsfeld. Geben Sie den Benutzernamen, das Passwort und die Datenbank ein, bevor Sie auf die Next >Schaltfläche klicken .

• Im Fenster Quellentabellen und -ansichten auswählen können Sie Zuordnungen bearbeiten, bevor Sie auf klicken Next > Schaltfläche .

• Aktivieren Sie das Run immediatelyKontrollkästchen und klicken Sie aufNext > Schaltfläche.

• Klicken Sie auf Finish Schaltfläche, um das Paket auszuführen.

Das Obige wurde auf dieser Website gefunden (ich habe es verwendet und getestet):

Zd8n8k
quelle
30
Es wäre schön, wenn Sie der Seite, auf der Sie diese Antwort von ...
SierraOscar
1
Es ist nicht erforderlich, die Tabelle vorab zu erstellen. Sie kann während des Importvorgangs erstellt werden
am
1
Ich finde es toll, dass Sie einfach eine Webseite mit der ach so nützlichen Zeile "Verbringen Sie einige Zeit damit, zu konfigurieren, wie die Daten importiert werden sollen" ausschneiden und einfügen . Das war alles, wonach ich suche: Ich scheine es überhaupt nicht konfigurieren zu können!
Auspex
Oh, und "Aktivieren Sie das Optionsfeld SQL Server-Authentifizierung verwenden" ist falsch, da Sie möglicherweise die Windows-Authentifizierung verwenden möchten. Es ist das, was für Sie funktioniert.
Auspex
danke fand eine Schritt-für-Schritt-Prozedur mit Bildern für die Implementierung der obigen Prozedur, die einen Blick wert ist: qawithexperts.com/article/sql/…
user3559462
22

2) Wenn der Client die CSV aus Excel erstellt, werden die Daten mit Komma in "..." (doppelte Anführungszeichen) [wie im folgenden Beispiel] eingeschlossen. Wie kann der Import damit umgehen?

Sie sollten die Optionen FORMAT = 'CSV', FIELDQUOTE = '"' verwenden:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FORMAT = 'CSV', 
    FIELDQUOTE = '"',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)
Oleg
quelle
1
Beachten Sie, dass der FORMAT-Bezeichner erst seit SQL Server 2017 verfügbar ist.
kristianp
13

Der beste, schnellste und einfachste Weg, um das Komma in Datenproblemen zu beheben, besteht darin, Excel zu verwenden, um eine durch Kommas getrennte Datei zu speichern, nachdem die Einstellung für das Listentrennzeichen von Windows auf etwas anderes als ein Komma (z. B. eine Pipe) festgelegt wurde. Dadurch wird eine durch Pipe (oder was auch immer) getrennte Datei für Sie generiert, die Sie dann importieren können. Dies wird hier beschrieben .

Sachin Kainth
quelle
4

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

Anschließend 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);
                }
            }
        }
    }
}
kombsh
quelle
ein vielleicht benutzerfreundlicherer Wrapper um die BulkCopy-Klassen busybulkcopy.codeplex.com
busytools
3

So würde ich es lösen:

  1. Speichern Sie Ihre CSV-Datei einfach als XLS-Blatt in Excel (auf diese Weise müssen Sie sich keine Gedanken über Trennzeichen machen. Das Tabellenformat von Excel wird als Tabelle gelesen und direkt in eine SQL-Tabelle importiert.)

  2. Importieren Sie die Datei mit SSIS

  3. Schreiben Sie ein benutzerdefiniertes Skript in den Importmanager, um die gesuchten Daten wegzulassen / zu ändern. (Oder führen Sie ein Masterskript aus, um die zu entfernenden Daten zu überprüfen.)

Viel Glück.

Zee
quelle
3
Downvote: Das Importieren von XLS-Dateien mit SSIS ist schrecklich. SSIS wird versuchen, die Datentypen der Excel-Daten zu erraten, kann jedoch falsch raten, und Sie können nichts dagegen tun. Viel besser mit CSV.
NReilingh
Nun, ich würde auch CSV vorschlagen, aber wenn Sie das Szenario des OP gelesen hätten, hätte er einige spezielle Szenarien, insbesondere mit Trennzeichen, die bei XLS-Blättern kein Problem darstellen. In der Regel erfordern spezielle Szenarien wie diese keine umfassende Lösung, sondern eine Korrektur, bei der die Daten erhalten bleiben. Während des Hochladens der Datei können Sie mit SSIS die Datenzuordnung zwischen Quell- und Zieltabelle auswählen, was wiederum den Aufwand verringert. Aus diesem Grund wurde diese Methode als schneller Hack vorgeschlagen.
Zee
1
SSIS kann bereits CSV-Texttrennzeichen verarbeiten. Wenn Sie ohnehin SSIS verwenden, scheint es mir, als würde ich mir die Mühe machen, Ihre CSV zuerst als XLS zu speichern, ohne Grund einen möglichen Bruch hinzuzufügen.
NReilingh
Außerdem habe ich routinemäßig CSV-Dateien, die für Excel zu groß sind.
Auspex
3

Da sie den SQL-Importassistenten nicht verwenden, lauten die Schritte wie folgt:

Geben Sie hier die Bildbeschreibung ein

  1. Klicken Sie in den Optionsaufgaben zum Importieren von Daten mit der rechten Maustaste auf die Datenbank.

  2. Sobald der Assistent geöffnet ist, wählen wir den zu implizierenden Datentyp aus. In diesem Fall wäre es das

Flatfile-Quelle

Wir wählen die CSV-Datei aus. Sie können den Datentyp der Tabellen in der CSV konfigurieren, aber es ist am besten, ihn aus der CSV zu holen.

  1. Klicken Sie auf Weiter und wählen Sie die letzte Option aus

SQL-Client

Abhängig von unserer Art der Authentifizierung wählen wir diese aus. Sobald dies erledigt ist, kommt eine sehr wichtige Option.

  1. Wir können die ID der Tabelle in der CSV definieren (es wird empfohlen, dass die Spalten der CSV genauso heißen wie die Felder in der Tabelle). In der Option Zuordnungen bearbeiten sehen wir die Vorschau jeder Tabelle mit der Spalte der Tabelle. Wenn der Assistent die ID standardmäßig einfügen soll, lassen wir die Option deaktiviert.

ID-Einfügung aktivieren

(normalerweise nicht ab 1) Wenn wir stattdessen eine Spalte mit der ID in der CSV haben, wählen wir die Option zum Einfügen der Aktivierungs-ID aus. Der nächste Schritt besteht darin, den Assistenten zu beenden. Wir können die Änderungen hier überprüfen.

Auf der anderen Seite können im folgenden Fenster Warnungen oder Warnungen angezeigt werden. Das Ideal ist, dies zu ignorieren, nur wenn sie Fehler hinterlassen, ist dies erforderlich, um Aufmerksamkeit zu schenken.

Dieser Link hat Bilder .

jarvis24
quelle
0

Importieren Sie die Datei in Excel, indem Sie zuerst Excel öffnen, dann zu DATA wechseln, aus TXT-Datei importieren, die CSV-Erweiterung auswählen, bei der 0 Präfixwerte beibehalten werden, und diese Spalte als TEXT speichern, da Excel sonst die führende 0 löscht (doppelklicken Sie NICHT mit Excel zu öffnen, wenn Sie numerische Daten in einem Feld haben, das mit einer 0 [Null] beginnt). Speichern Sie dann einfach als tabulatorgetrennte Textdatei. Wenn Sie in Excel importieren, erhalten Sie die Option, als ALLGEMEIN, TEXT usw. zu speichern. Wählen Sie TEXT, damit auch Anführungszeichen in der Mitte einer Zeichenfolge in einem Feld wie YourCompany, LLC erhalten bleiben.

BULK INSERT dbo.YourTableName
FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
WITH (
FirstRow = 2, (if skipping a header row)
FIELDTERMINATOR = '\t',
ROWTERMINATOR   = '\n'
)

Ich wünschte, ich könnte die Funktionen FORMAT und Fieldquote verwenden, aber dies scheint in meiner Version von SSMS nicht unterstützt zu werden

Steve Yo
quelle
0

Ich weiß, dass es akzeptierte Antworten gibt, aber ich möchte trotzdem mein Szenario teilen, das vielleicht jemandem hilft, sein Problem zu lösen WERKZEUGE

  • ASP.NET
  • EF CODE-ERSTER ANSATZ
  • SSMS
  • EXCEL

SZENARIO i wurde das Laden des Datensatzes , die im CSV - Format ist , die später auf die Ansicht zu zeigen war ich versucht , die Massenladen zu benutzen , aber ich nicht in der Lage ist , wie zu laden BULK LOADwurde mit

FIELDTERMINATOR = ','

und Excel-Zelle wurde auch verwendet, , aber ich konnte auch nicht Flat file sourcedirekt verwenden, weil ich verwendet habeCode-First Approach das nur erstellte Modell in SSMS DB und tat, nicht in dem Modell, aus dem ich die Eigenschaften später verwenden musste.

LÖSUNG

  1. Ich habe eine Flatfile -Quelle verwendet und eine DB-Tabelle aus einer CSV-Datei erstellt ( Rechtsklick auf DB in SSMS -> FlatFile importieren -> CSV-Pfad auswählen und alle Einstellungen wie angegeben vornehmen ).
  2. Modellklasse in Visual Studio erstellt (Sie MÜSSEN alle Datentypen und Namen beibehalten, die mit denen der in SQL geladenen CSV-Datei identisch sind).
  3. Verwendung Add-Migrationin der NuGet-Paketkonsole
  4. Aktualisieren Sie die Datenbank
Chamäleon
quelle
0

Ich weiß, dass dies nicht die genaue Lösung für die obige Frage ist, aber für mich war es ein Albtraum, als ich versuchte, Daten von einer Datenbank auf einem separaten Server auf meinen lokalen Server zu kopieren .

Ich habe versucht, dies zu tun, indem ich zuerst Daten vom Server auf meine lokale Tabelle exportierteCSV/txt und sie dann in meine lokale Tabelle importierte .

Beiden Lösungen: mit dem Schreiben der Abfrage Import nach unten CSVoder den SSMS Datenimport - Assistenten wurde immer Fehler produziert (Fehler waren sehr allgemein gehalten , sagten , dass es ein Problem ist , das Parsen). Und obwohl ich nichts Besonderes tun, nur exportieren zu CSVund dann zu versuchen , Import CSV in dem lokalen DB, waren die Fehler immer da.

Ich habe versucht, den Mapping-Bereich und die Datenvorschau zu betrachten, aber es gab immer ein großes Durcheinander. Und ich weiß, dass das Hauptproblem darin bestand, aus einer der tableSpalten zu kommen, die enthielt, JSONund der SQLParser behandelte das falsch.

Also habe ich mir irgendwann eine andere Lösung ausgedacht und möchte sie teilen, falls jemand anderes ein ähnliches Problem hat.


Ich habe den Export-Assistenten verwendet auf dem externen Server verwendet.

Führen Sie die folgenden Schritte aus, um denselben Vorgang zu wiederholen:
1) Klicken Sie mit der rechten Maustaste auf die Datenbank und wählen SieTasks -> Export Data...

2) Wenn der Assistent geöffnet wird, wählen Sie Weiter und anstelle von "Datenquelle:" die Option "SQL Server Native Client".

Geben Sie hier die Bildbeschreibung ein

Bei externen Servern müssen Sie höchstwahrscheinlich "SQL Server-Authentifizierung verwenden" für "Authentifizierungsmodus:" auswählen.

3) Nachdem Sie auf Weiter geklickt haben, müssen Sie das Ziel auswählen .
Wählen Sie dazu erneut "SQL Server Native Client".
Dieses Mal können Sie Ihre lokale (oder eine andere externe DB) angeben DB.

Geben Sie hier die Bildbeschreibung ein

4) Nachdem Sie auf die Schaltfläche Weiter geklickt haben, haben Sie zwei Möglichkeiten, entweder die gesamte Tabelle von einer DBin eine andere zu kopieren oder die Abfrage aufzuschreiben, um die genauen zu kopierenden Daten anzugeben. In meinem Fall brauchte ich nicht die gesamte Tabelle (sie war zu groß), sondern nur einen Teil davon. Daher habe ich "Eine Abfrage schreiben, um die zu übertragenden Daten anzugeben" ausgewählt.

Geben Sie hier die Bildbeschreibung ein

Ich würde vorschlagen, die Abfrage in einem separaten Abfrageeditor aufzuschreiben und zu testen, bevor Sie zum Assistenten wechseln.

5) Und schließlich müssen Sie die Zieltabelle angeben, in der die Daten ausgewählt werden.

Geben Sie hier die Bildbeschreibung ein

Ich schlage vor, es als [dbo].[Query]oder einen benutzerdefinierten TableNamen zu belassen, falls beim Exportieren der Daten Fehler auftreten oder wenn Sie sich über die Daten nicht sicher sind und sie weiter analysieren möchten, bevor Sie zu der gewünschten Tabelle wechseln.

Gehen Sie jetzt direkt zum Ende des Assistenten, indem Sie auf die Schaltflächen Weiter / Fertig stellen klicken.

Arsen Khachaturyan
quelle