2008-09-18 58 views
23

Necesito importar un gran archivo CSV en un servidor SQL. Estoy usando esto:SQL Importación masiva desde CSV

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

problema es todos mis campos están rodeados por comillas (" ") para una fila en realidad se parece:

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

puedo importar alguna manera a granel ellos y decirle a SQL usar las comillas como delimitadores de campo?

Editar: El problema de usar '", "' como delimitador, como en los ejemplos sugeridos es que: Lo que la mayoría de los ejemplos hacen, se importan los datos, incluyendo la primera" en la primera columna y el último "En el último, entonces siguen adelante y lo quitan. Por desgracia, mi primera (y última) columna son de fecha y hora y no permiten un "20080902 para ser importado como fecha.

Según lo que he estado leyendo, creo que FORMATFILE es el camino a seguir, pero la documentación (incluido MSDN) es terriblemente poco servicial.

+0

debe volver a la etiqueta este sqlserver entonces sabemos qué base de datos está usando. – JasonS

Respuesta

3

Sé que esta no es una solución real, pero utilizo una tabla ficticia para la importación con nvarchar configurado para todo. A continuación, hago una inserción que elimina los "caracteres y realiza las conversiones. No es bonita, pero hace el trabajo.

+6

¿Cómo se dividen los campos? cuando puede haber comas entre las comillas? –

13

Trate FIELDTERMINATOR='","'

Aquí es un gran enlace para ayudar con la primera y última cita ... mira cómo se utiliza la subcadena del SP

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

+0

No funcionará :-(. El primer campo de la tabla es una fecha e importará la comilla principal (") con ella, generando un error – Radu094

+1

También tenga cuidado con las aplicaciones que exportan CSV con cadenas citadas pero números no citados. – finnw

+1

También funcionó para mí. Estoy usando un archivo de formato xml para usar el atributo Terminator en lugar de FIELDTERMINATOR. Además, en mi última columna utilicé el siguiente TERMINATOR = '"\ r \ n' –

1

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

Al utilizar el Administrador corporativo, haga clic con el botón secundario en Importar datos para seleccionar su delimitador.

4

Pruebe OpenRowSet. Esto se puede usar para importar cosas de Excel. Excel puede abrir archivos 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;

0

También podría usar DTS o SSIS.

1

Tiene que tener cuidado con BCP/BULK INSERT porque ni BSP ni Bulk Insert lo manejan bien si las citas no son consistentes, incluso con archivos de formato (incluso los archivos de formato XML no ofrecen la opción) y dummy [" ] caracteres al principio y al final y utilizando [","] como separador. Técnicamente, los archivos CSV no necesitan tener ["] caracteres si no hay incrustados [,] caracteres

Es por esta razón que la coma los archivos a veces limitados se conocen como archivos de comedia limitada.

OpenRowSet requerirá Excel en el servidor y podría ser problemático en entornos de 64 bits. Sé que es problemático usar Excel en Jet en 64 bits.

SSIS es realmente su mejor opción si el archivo puede variar de sus expectativas en el futuro.

0

¿Tiene control sobre el formato de entrada? | (tuberías), y \ t generalmente hacen mejores terminadores de campo.

0

Si descubres cómo hacer que el archivo se analice en una DataTable, te sugiero clase SqlBulkInsert para insertarlo en SQL Server

1

u puede probar este código, que es muy dulce si lo desea, esto eliminará punto y coma no deseados de su código si por ejemplo los datos es la siguiente:..
"Kelly" , "Reynold", "[email protected]"

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 **' %" '** 
9

Otro truco que a veces uso, es abrir el archivo CSV en Excel, 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 hacia abajo puede rellenar esto en cada fila para usted. Luego solo copie y pegue el resultado en una nueva ventana de consulta.

Es de la vieja escuela, pero si solo tiene que hacer importaciones de vez en cuando, le ahorra perder el tiempo leyendo toda la oscura documentación sobre la forma "correcta" de hacerlo.

+0

Buen consejo, @jorgeburgos – karlgrz

+0

Buen consejo, gracias! – DanB

+1

Sé que esta respuesta es antigua, pero acabo de llegar aquí con una búsqueda en Google de algo similar. Este es un buen momento para generar cualquier código de datos tabulares, no solo código para cargar una instrucción SQL. Puede poner un plantilla en algún lugar del archivo de Excel, luego haga '= SUBSTITUIR ($ Z $ 999," placeholder_a "," '"& SUBSTITUTE (A2,"' "," '' ") &" '")," placeholder_b ", SUSTITUIR (B2, "'", "' '")) '. Suponiendo que tiene una plantilla en $ Z $ 999. –

2

opinión de la identificación de uso FileHelpers sus un código abierto biblioteca

1

abetos que necesita para importar un archivo CSV en la tabla de datos

A continuación, puede insertar filas a granel 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); 
       } 
      } 
     } 
    } 
} 
Cuestiones relacionadas