Importación masiva de SQL desde CSV

Necesito importar un gran file CSV en un server SQL. Estoy usando esto:

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

El problema es que todos mis campos están rodeados por comillas ("") así que una fila realmente se ve así:

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

¿Puedo, de alguna manera, importarlos a granel y decirle a SQL que use las comillas como delimitadores de campo?

Editar : El problema con el uso de '","' como delimitador, como en los ejemplos sugeridos es que: lo que hacen la mayoría de los ejemplos, es que importan los datos incluyendo el primero "en la primera columna y el último" en el último, luego ve y quítate eso. Por desgracia, mi primera (y última) columna son de date y hora y no permitirán que se importe un "20080902 como date y hora".

Por lo que he estado leyendo, creo que FORMATFILE es el path a seguir, pero la documentation (incluida MSDN) es tremendamente inútil.

Sé que esta no es una solución real, pero utilizo una tabla ficticia para la import con nvarchar configurado para todo. Luego hago una inserción que elimina los "caracteres y hace las conversiones. No es bonita, pero cumple su function.

Pruebe FIELDTERMINATOR='","'

Aquí hay un gran enlace para ayudar con la primera y última cita … mire cómo usó la subcadena SP

http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file

Otro truco que a veces uso es abrir el file CSV en Excel y luego escribir el enunciado SQL en una celda al final de cada fila. Por ejemplo:

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

Un relleno puede llenarlo en cada fila. Luego solo copie y pegue el resultado en una nueva window de consulta.

Es de la vieja escuela, pero si solo tienes que hacer importaciones de vez en cuando, te ahorra perder el time leyendo toda la oscura documentation sobre la forma "correcta" de hacerlo.

Pruebe OpenRowSet . Esto se puede usar para importar cosas de Excel. Excel puede abrir files CSV, por lo que solo necesita averiguar el [ConnectionString] correcto [2].

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

Id decir usar FileHelpers es una biblioteca de código abierto

¿Necesitas hacer esto programáticamente, o es un disparo de una sola vez?

Con el Administrador corporativo, haga clic con el button secundario en Importar datos para seleccionar su delimitador.

Debe tener cuidado con BCP / BULK INSERT porque ni BSP ni Bulk Insert lo manejan bien si las citas no son consistentes, incluso con files de formatting (incluso los files de formatting XML no ofrecen la opción) y caracteres ficticios ["] en el principio y final y utilizando [","] como separador. Técnicamente, los files CSV no necesitan tener caracteres ["] si no hay caracteres embeddeds [,]

Es por esta razón que los files delimitados por comas a veces se denominan files de comedia limitada.

OpenRowSet requerirá Excel en el server y podría ser problemático en entornos de 64 bits: sé que es problemático al usar Excel en Jet en 64 bits.

SSIS es realmente su mejor opción si el file es probable que varíe de sus expectativas en el futuro.

Puedes probar este código, que es muy bueno si lo deseas, esto eliminará los puntos y comas no deseados de tu código. si, por ejemplo, sus datos son así:
"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 **' %" '** 

Primero debes importar el file CSV a la Tabla de datos

Luego puede insert filas masivas usando SQLBulkCopy

 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); } } } } } 

Sí, K Richard tiene razón: FIELDTERMINATOR = '","'

Consulte http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file para get más información.

También podría usar DTS o SSIS.

¿Tienes control sobre el formatting de input? | (tuberías), y \ t generalmente hacen mejores terminadores de campo.

Si descubres cómo descomprimir el file en una DataTable, te sugiero la class SqlBulkInsert para insertlo en SQL Server.