Estoy buscando ayuda para importar un file .csv
en SQL Server usando BULK INSERT
y tengo algunas preguntas básicas.
Cuestiones:
Los datos del file CSV pueden tener ,
(coma) en el medio (por ejemplo, descripción), entonces, ¿cómo puedo hacer que la import maneje estos datos?
Si el cliente crea el file CSV desde Excel, los datos que tienen una coma se incluyen entre ""
(comillas dobles) [como en el ejemplo siguiente], entonces, ¿cómo puede la import manejar esto?
¿Cómo rastreamos si algunas filas tienen datos incorrectos, que importan saltos? (la import saltea filas que no son importables)
Aquí está el CSV de muestra con encabezado:
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.
Y statement SQL para importar:
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 )
Importación basada en SQL Server CSV
1) Los datos del file CSV pueden tener
,
(coma) en el medio (por ejemplo, descripción), entonces, ¿cómo puedo hacer que la import maneje estos datos?
Solución
Si está usando ,
(coma) como delimitador, entonces no hay forma de diferenciar entre una coma como un terminador de campo y una coma en sus datos. FIELDTERMINATOR
un FIELDTERMINATOR
diferente como ||
. El código se vería así y esto manejará la coma y la barra única perfectamente.
2) Si el cliente crea el csv de excel, entonces los datos que tienen una coma se incluyen entre
" ... "
(comillas dobles) [como en el ejemplo siguiente], entonces, ¿cómo puede manejar la import esto?
Solución
Si está utilizando BULK insertado, entonces no hay manera de manejar comillas dobles, los datos se insertán con comillas dobles en las filas. después de insert los datos en la tabla, puede replace esas comillas dobles por ' '.
update table set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
3) ¿Cómo rastreamos si algunas filas tienen datos incorrectos, que importan omisiones? (¿Importar saltea filas que no son importables)?
Solución
Para manejar las filas que no están cargadas en la tabla debido a datos o formattings no válidos, podría manejarse usando la propiedad ERRORFILE , especificar el nombre del file de error, escribirá las filas que tienen el error en el file de error. el código debería ser similar.
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 )
La forma mejor, más rápida y más fácil de resolver el problema de coma en datos es usar Excel para save un file separado por comas después de haber establecido la configuration del separador de lists de Windows en algo que no sea una coma (como una tubería). Esto generará una tubería (o lo que sea) file separado para usted que luego podrá importar. Esto se describe aquí .
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); } } } } }
Así es como lo resolvería:
Simplemente guarde su file CSV como una hoja XLS en Excel (Al hacerlo, no tendría que preocuparse por los delimitadores. El formatting de spreadsheet de Excel se leerá como una tabla y se importará directamente en una tabla SQL)
Importar el file usando SSIS
Escriba una secuencia de commands personalizada en el administrador de import para omitir / modificar los datos que está buscando (o ejecute una secuencia de commands maestra para examinar los datos que desea eliminar)
Buena suerte.
Referencia