Frage

Ich brauche eine große CSV-Datei in einen SQL-Server zu importieren. Ich verwende diese:

BULK 
INSERT CSVTest
        FROM 'c:\csvfile.txt'
            WITH
    (
                FIELDTERMINATOR = ',',
                ROWTERMINATOR = '\n'
    )
GO

Problem wird alle meine Felder durch Anführungszeichen (“„) umgibt, so tatsächlich eine Reihe wie folgt aussieht:

"1","","2","","sometimes with comma , inside", "" 

Kann ich sie irgendwie importieren losen und sagen SQL die Anführungszeichen als Feldbegrenzungszeichen verwenden?

Bearbeiten : Das Problem bei der Verwendung von ' ""' als Trennzeichen, wie in den Beispielen vorgeschlagen ist, dass:  Was die meisten Beispiele tun, ist, dass sie die Daten einschließlich der ersten „in der ersten Spalte und der letzten“ in der letzten importieren, dann gehen sie voran und dass Streifen aus. Ach meine erste (und letzte) Spalte sind Datetime und nicht ein „20080902 erlauben als Datum- und importiert werden.

Von dem, was ich habe gelesen, arround ich denke, die Art und Weise ist FORMATFILE zu gehen, aber Dokumentation (einschließlich MSDN) ist schrecklich unhelpfull.

War es hilfreich?

Lösung

Ich weiß, dass dies keine wirkliche Lösung ist, aber ich benutze eine Dummy-Tabelle für den Import mit nvarchar Set für alles. Dann mache ich ein Einsatz, der die "Zeichen Streifen aus und macht die Konvertierungen. Es ist nicht schön, aber es macht den Job.

Andere Tipps

Versuchen FIELDTERMINATOR='","'

Hier ist eine große Verbindung mit dem ersten und dem letzten Zitat zu helfen ... schauen, wie er verwendet die Teilkette der SP

http: //www.sqlteam. com / article / using-Bulk-Insert-to-load-a-Text-Datei

Einen weiteren Hack, den ich manchmal verwenden, ist die CSV in Excel zu öffnen, dann schreiben Sie Ihre SQL-Anweisung in eine Zelle am Ende jeder Zeile. Zum Beispiel:

=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")

Ein Fill-down für Sie in jeder Zeile füllen diese. Dann einfach kopieren und die Ausgabe in ein neues Abfrage-Fenster einfügen.

Es ist die alte Schule, aber wenn man nur die Einfuhren hin und wieder tun muß, während es spart Sie rumgespielt alles obskure Dokumentation auf dem ‚richtigen‘ Weg mit dem Lesen zu tun.

Versuchen Sie OpenRowset . Dies kann dazu verwendet werden, Excel Sachen zu importieren. Excel kann CSV-Dateien öffnen, so dass Sie brauchen nur die richtige [Connectionstring] [2] zu verstehen.

[2]: Driver = {Microsoft Text Driver (* .txt; * .csv)}; Dbq = c: \ txtFilesFolder \; Extensions = asc, csv, tab, txt;

Id sagen Verwendung FileHelpers seine eine Open-Source-Bibliothek

Haben Sie dies programmatisch tun müssen, oder ist es ein einmaliger Schuss?

, um den Enterprise Manager mit der rechten Maustaste auf Daten importieren können Sie Ihre Trennzeichen wählen.

Sie haben mit BCP / BULK INSERT aufpassen, weil weder BSP oder Bulk Insert diese gut behandeln, wenn die Angabe nicht konsistent ist, auch mit Format-Dateien (auch XML-Dateien bieten nicht die Option) und dummy [ "] Zeichen am Anfang und Ende und mit [“,‚] als Trennzeichen. Technisch CSV-Dateien müssen Zeichen nicht haben [‘], wenn es keine eingebetteten [,] Zeichen

Es ist aus diesem Grund, dass kommagetrennte Dateien manchmal bezeichnet werden als Komödie-begrenzte Dateien.

OpenRowset wird Excel benötigt auf dem Server und kann in 64-Bit-Umgebungen problematisch sein - ich weiß, dass es problematisch ist in 64-Bit-Excel in Jet mit

.

SSIS ist wirklich die beste Wahl, wenn die Datei wahrscheinlich von Ihren Erwartungen in der Zukunft verändern.

u können diesen Code versuchen, die sehr süß ist, wenn Sie wollen, dies unerwünschte Semikolons aus dem Code entfernen. wenn zum Beispiel Ihre Daten wie folgt aus:
"Kelly", "Reynold", "kelly@reynold.com"

Bulk insert test1
from 'c:\1.txt' with ( 
    fieldterminator ='","'
    ,rowterminator='\n')

update test1<br>
set name =Substring (name , 2,len(name))
where name like **' "% '**

update test1
set email=substring(email, 1,len(email)-1)
where email like **' %" '**

Firs Sie benötigen CSV-Datei in Datentabelle importieren

Dann können Sie Bulk-Reihen mit SqlBulkCopy 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);
                }
            }
        }
    }
}

Yup, K Richard hat Recht: FIELDTERMINATOR = '","'

Siehe http: // www. sqlteam.com/article/using-bulk-insert-to-load-a-text-file für weitere Informationen.

Sie könnten auch verwenden, DTS oder SSIS.

Haben Sie die Kontrolle über das Eingabeformat? | (Rohre) und \ t in der Regel für eine bessere Feldabschluss machen.

Wenn Sie herausfinden, wie die Datei in ein Datatable analysiert zu bekommen, würde ich die SqlBulkInsert Klasse vorschlagen, damit es in SQL Server eingefügt wird.

Dies ist eine alte Frage, so dass ich dies schreibe jemanden, der darauf stolpern zu helfen.

SQL Server 2017 stellt die FIELDQUOTE Parameter, die für diesen genauen Anwendungsfall vorgesehen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top