SQL Bulk-Import von CSV
-
01-07-2019 - |
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.
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.