Estoy buscando ayuda para importar un archivo .csv
en SQL Server usando BULK INSERT
y tengo algunas preguntas básicas.
Cuestiones:
Los datos del archivo CSV pueden tener ,
(coma) entre ellos (Ej: descripción), así que ¿cómo puedo hacer la importación manejando estos datos?
""
(comillas dobles) [como el ejemplo siguiente], así que ¿cómo la importación puede manejar esto? Aquí está el ejemplo de CSV con cabecera:
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 la sentencia 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 CSV basada en SQL Server
,
(coma) entre ellos (Ej:descripción), así que ¿cómo puedo hacer que el manejo de la importación de estos datos?
Solución
Si usted está usando ,
(coma) como un delimitador, entonces no hay manera de diferenciar entre una coma como un terminador de campo y una coma en sus datos. Yo usaría un FIELDTERMINATOR
diferente como ||
. El código se vería como y esto manejará la coma y la barra simple perfectamente.
coma están encerrados dentro de
" ... "
(comillas dobles) [como el siguiente ejemplo] así que ¿cómo la importación puede manejar esto?
Solución
Si usted'está utilizando BULK insert entonces no hay manera de manejar las comillas dobles, los datos serán insertados con comillas dobles en las filas. Después de insertar los datos en la tabla puede reemplazar esas comillas dobles con '` `'.
update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
- ¿Cómo podemos saber si algunas filas tienen datos erróneos, que la importación se salta? (¿la importación salta las filas que no son importables)?
Solución
Para manejar las filas que no se cargan en la tabla debido a los datos no válidos o el formato, podría ser manejar usando la propiedad ERRORFILE, especificar el nombre del archivo de error, escribirá las filas que tienen error en el archivo de error. el código debe ser como.
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 mejor, más rápida y más fácil manera de resolver el problema de la coma en los datos es utilizar Excel para guardar un archivo separado por comas después de haber configurado el separador de listas de Windows a algo que no sea una coma (como una tubería). Esto generará un archivo separado por tuberías (o lo que sea) que podrá importar. Esto se describe aquí.
Primero debe importar el archivo CSV a la tabla de datos
Luego puede insertar 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);
}
}
}
}
}